有没有一种很好的方式来表达 Python 中 "override specifier" 的反义词?

Is there a nice way to express the opposite of an "override specifier" in Python?

C++11 添加了 override specifier,这是一个方法覆盖父 class 方法的承诺。我想表达与此相反的意思,即方法不是由任何父 classes 实现的。我可以在没有元classes 的情况下表达它吗,例如使用装饰器?

这就是我目前正在做的事情

class EchoSoma(Soma):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        assert not hasattr(super(), 'inject_basic_evidence')

    def inject_basic_evidence(self, basic_in):
        super().fire(basic_in)

不,没有元class。

在 class 块内执行的代码不知道 superclass(es),并且 "this class" 尚不存在。您需要一些只能由 metaclass 提供的预处理或 post 处理。或者,您需要将 superclass(es) 传递给装饰器,装饰器需要重建 MRO,最有可能通过构建临时 class 并检查其 __mro__ 属性.这比只写你试图避免的元class更混乱。

签入 __init__ 还不够好,因为这仅在实例化 class 时完成,而不是在最初创建 class 时完成。

metaclass 解决方案看起来像这样:

class NoOverrideMeta(type):
    def __new__(mcs, name, bases, dct, no_override=None):
        if no_override is None:
            no_override = []
        cls = super().__new__(name, bases, dct)
        for meth_name in no_override:
            assert not hasattr(super(cls, cls), meth_name)
        return cls

class EchoSoma(Soma, metaclass=NoOverideMeta, no_override=['inject_basic_evidence']):

    def inject_basic_evidence(self, basic_in):
        super().fire(basic_in)

此示例通过关键字参数传递方法名称,这是 3.x 中的一个新功能。装饰器会更简洁但更复杂一些;您将遍历 dct 寻找装饰方法。