有没有一种很好的方式来表达 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
寻找装饰方法。
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
寻找装饰方法。