Вызов подкласса @classmethod из родительского класса - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь сделать следующее:

class A:

    @classmethod
    def test_function(cls, message):
      cls.__get_the_function()

class B(A):

    @classmethod
    def __get_the_function(cls):
        return print("BBBB")


class C(A):

    @classmethod
    def __get_the_function(cls):
        return print("CCCC")

однако, когда я звоню:

B.test_function("Test")

Я получаю следующее:

AttributeError: type object 'B' has no attribute '_A__get_the_function'

I Я хочу, чтобы класс A - __get_the_function из подкласса (класс B или C зависит от того, какой из них я использую), но похоже, что он пытается найти его сам по себе.

ПРИМЕЧАНИЕ: я использую Python 3.8.2

1 Ответ

3 голосов
/ 22 марта 2020

__ имена с префиксом обрабатываются специально при создании класса. Имя заменяется, когда функция определена искаженным именем, как если бы вы сначала определили функцию как

@classmethod
def test_function(cls, message):
    cls._A__get_the_function()

.

Это сделано, чтобы явно предоставить способ скрыть имя от подкласса. Поскольку вы хотите переопределить имя, __get_the_function не подходит; используйте обычное _ префиксное имя, если вы хотите пометить его как личное:

class A:

    @classmethod
    def test_function(cls, message):
      cls._get_the_function()

    # Define *something*, since test_function assumes it
    # will exist. It doesn't have to *do* anything, though,
    # until you override it.
    @classmethod
    def _get_the_function(cls):
        pass
...