我使用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__
中访问该变量?
编辑: 澄清一下:我已经有了一个基类,从中我可以派生出许多其他的子类。所有这些类共享许多属性的事实是我决定首先使用基类的主要原因之一。因此,在每个派生类中需要单独实现像实例计数器这样简单的东西似乎是多余的。
访问子类变量似乎已经加入了here。剩下的问题是,如何在我的抽象基类中定义类级变量,这对于每个子类都是不同的。