Jos*_*oyd 3 python oop superclass python-3.x
我有一系列的类,继承自几个可能的父级之一,这些父级都共享一个基类。parameters每个类都有一个基于基类的类范围 Dict[str, object]parameters
from copy import deepcopy
class BaseClass:
parameters = {
'example_param1': ParamObject(name='example_param1', editable=True),
}
class MiddleClass(Baseclass):
parameters = {
**deepcopy(Baseclass.parameters),
'example_param2': ParamObject(name='example_param2', editable=False),
}
class ChildClass(MiddleClass):
parameters = {
**deepcopy(MiddleClass.parameters),
'example_param3': ParamObject(name='example_param3', editable=True),
}
Run Code Online (Sandbox Code Playgroud)
这个实现完成了工作,但我发现这条**deepcopy(Baseclass.parameters),线并不令人满意。随着时间的推移,这些子类将由仅对编码有基本了解的人进行编辑,因此我希望使代码尽可能简单且可剪切粘贴。
我可以在类范围内调用什么来获得 的等价物吗super().__class__?我希望用户能够将基类从 更改为 ,而MiddleClass无需MiddleClass2记住在多个位置更改基类。
您可以使用__init_subclass__将参数从父类直接添加到显式定义的parameters属性,但代价是插入顺序被颠倒(如果这很重要)。
class ParameterBase:
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
for pc in cls.__bases__:
d = getattr(pc, 'parameters', {})
cls.parameters.update(d)
class BaseClass(ParameterBase):
parameters = {
'example_param1': ParamObject(name='example_param1', editable=True),
}
class MiddleClass(BaseClass):
parameters = {
'example_param2': ParamObject(name='example_param2', editable=False),
}
class ChildClass(MiddleClass):
parameters = {
'example_param3': ParamObject(name='example_param3', editable=True),
}
Run Code Online (Sandbox Code Playgroud)