python-3.x - 在抽象基类中实现子类级别变量
问题描述
我已经创建了一个抽象基类,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__
?
编辑:澄清:我已经有一个基类,我从中派生了许多其他子类。所有这些类共享许多属性的事实是我决定首先使用基类的主要原因之一。因此,需要在每个派生类中分别实现像实例计数器这样简单的东西似乎是多余的。
访问子类变量似乎已经在这里解决了。剩下的问题是,如何在我的抽象基类中定义一个类级变量,每个子类都不同。
解决方案
推荐阅读
- ruby - 如何使用 Jekyll 解决“液体异常:无法加载此类文件”?
- npm - 'npm start' 立即抛出错误,几乎没有任何代码
- c# - 如何在没有 ifelse 的情况下动态使用通用方法?
- r - 将for循环的输出存储到R中的列表中
- r - 如何在闪亮选项卡中的绘图下方显示表格?
- rendering - 在搅拌机中渲染时的暗阴影
- codenameone - sendSMS 不再启动到 SMS 应用程序
- r - 从数据框中删除值大于 -1 的列
- authentication - speakeasy:speakeasy.totp.verify() 返回 false
- tomcat - tomcat.service 在正确安装 Tomcat 时失败