有没有办法从类范围引用对象的基 __class__ ?

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记住在多个位置更改基类。

che*_*ner 5

您可以使用__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)