Метод абстрактного класса: методы класса в инициализаторе - PullRequest
0 голосов
/ 28 марта 2019

У меня есть абстрактный класс с необязательной переменной, которая ищет реализацию абстрактного метода для значений этой переменной по умолчанию:

import abc
from typing import List

class ABCFoo(abc.ABC):

    def __init__(self, params = None):
        self.params = params
        if params is None:
            self.params = self.__class__.params_default()
            # self.params = ABCFoo.params_default()

    @classmethod
    @abc.abstractmethod
    def params_default(cls) -> List[float]:
        raise(NotImplementedError('ABCModel subclasses must supply default parameters.'))

Затем я подкласс этого класса следующим образом:

class ABCBar(ABCFoo):

    def __init__(self, params = None):
        super().__init__(params)

    @classmethod
    @abc.abstractmethod
    def params_default(cls) -> List[float]:
        super().params_default()

и снова подкласс его (!) Следующим образом:

class Bar(ABCBar):

    @classmethod
    def params_default(cls) -> List[float]:
        return [0, 1, 2, 3]

Я делаю два экземпляра этого последнего класса следующим образом:

bar = Bar([4, 5, 6, 7])
baz = Bar()
print(f'bar.params = {bar.params}')
print(f'baz.params = {baz.params}')

, который печатает ожидаемые значения:

bar.params = [4, 5, 6, 7]

baz.params = [0, 1, 2, 3]

Однако, если я изменю инициализатор ABCFoo на:

def __init__(self, params = None):
    self.params = params
    if params is None:
        # self.params = self.__class__.params_default()
        self.params = ABCFoo.params_default()

, ошибка реализации будет вызываться

NotImplementedError: подклассы ABCModel должны предоставлять параметры по умолчанию.

Почему self.__class__.params_default() работает, а ABCFoo.params_default() нет?

Спасибо за любую помощь.

...