У меня есть абстрактный класс с необязательной переменной, которая ищет реализацию абстрактного метода для значений этой переменной по умолчанию:
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()
нет?
Спасибо за любую помощь.