我有一个带有可选变量的抽象类,该类寻找该变量默认值的抽象方法的实现:
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()
无效?
感谢您的帮助。