首页 > 解决方案 > 在抽象基类中实现子类级别变量

问题描述

我已经创建了一个抽象基类,metaclass=ABCMeta用于实现其所有派生类都应具有的一些默认方法和属性,如下所示:

class BaseClass(metaclass=ABCMeta):

    def __init__(self):
        self.params = OrderedDict()

    # some function all children must implement
    @abstractmethod
    def fn():
        pass

    # some property all children will have
    @property
    def n_params(self):
        return len(self.params)

现在,我想计算每个派生类创建了多少个实例,因为我想用数字打印它们的名称。我可以像这样轻松实现它:

class ChildClass(BaseClass):
    # nr of instances of ChildClass
    _n = 0

    def __init__(self, mu, sigma, amp):
        # initialize ABC
        super().__init__()

        ChildClass._n += 1        
        self.name = f'ChildClass {ChildClass._n}'

    # must be overridden by each child class
    @staticmethod
    def fn(name):
        # do stuff
        print(f'hello {name}')

BaseClass但是,我需要在每个单独派生的类中实现这一点。自己实现它会更加优雅BaseClass

我正在寻找与 的相反的super()东西,也许是这样的:

class BaseClass(metaclass=ABCMeta):
    # instance counter for derived classes
    child()._n = 0
    def __init__(self):
        self.params = OrderedDict()

        child()._n += 1

我可以ChildClass._n在中实现类级别变量BaseClass吗?如果是这样,我如何访问该变量BaseClass.__init__

编辑:澄清:我已经有一个基类,我从中派生了许多其他子类。所有这些类共享许多属性的事实是我决定首先使用基类的主要原因之一。因此,需要在每个派生类中分别实现像实例计数器这样简单的东西似乎是多余的。

访问子类变量似乎已经在这里解决了。剩下的问题是,如何在我的抽象基类中定义一个类级变量,每个子类都不同。

标签: python-3.xinheritanceparent-childabc

解决方案


推荐阅读