抽象类方法:初始化程序中的类方法

时间:2019-03-28 11:13:28

标签: python-3.x class abstract-methods

我有一个带有可选变量的抽象类,该类寻找该变量默认值的抽象方法的实现:

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()无效?

感谢您的帮助。

0 个答案:

没有答案