【发布时间】:2021-03-13 19:49:53
【问题描述】:
我有一系列的类,继承自几个可能的父类中的一个,它们都共享一个基类。每个类都有一个类范围 Dict[str, object] parameters,它基于基类 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),
}
这个实现可以完成这项工作,但我发现**deepcopy(Baseclass.parameters), 行不令人满意。随着时间的推移,这些子类将由仅对编码有基本了解的人进行编辑,因此我希望使代码尽可能简单且可剪切和粘贴。
我可以在课堂范围内调用什么来获得super().__class__ 的等价物吗?我希望用户能够将基类从 MiddleClass 更改为 MiddleClass2,而无需记住在多个位置更改基类。
【问题讨论】:
-
请注意,
super().__class__也不会做你想做的事,即使在实例方法中 - 它只会提供super。 -
这可能是
__init_subclass__的情况,尽管我不清楚如何最好地构建它。 -
参数是否必须在字典中?如果它们是类的直接属性,您将免费获得所需的继承行为。如果它们必须与其他类属性区分开来,那么命名约定(例如您的示例中的
*_param*)可能就足够了。 -
我会为此使用元类。您可以走 MRO 并结合所有这些参数。
-
@alkasm
__init_subclass__的存在是为了避免必须为此类用例使用元类。
标签: python python-3.x oop superclass