gpt4 book ai didi

python - 有没有一种好的方法可以在 Python 中表达 "override specifier"的相反值?

转载 作者:行者123 更新时间:2023-12-01 04:34:29 24 4
gpt4 key购买 nike

C++11 添加了 override specifier ,这是一个方法重写父类方法的 promise 。我想表达相反的观点,即方法不是由任何父类实现的。我可以在没有元类的情况下表达这一点,例如使用装饰器吗?

这就是我现在正在做的事情

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)

最佳答案

不,如果没有元类,你就无法做到这一点。

在类 block 内执行的代码不知道父类(super class),并且“此类”尚不存在。您需要一些只能由元类提供的预处理或后处理。或者,您需要将父类(super class)传递给装饰器,装饰器需要重建 MRO,最有可能的方法是构建一个临时类并检查其 __mro__属性。这比仅仅编写您试图避免的元类更困惑。

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

元类解决方案看起来像这样:

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寻找装饰方法。

关于python - 有没有一种好的方法可以在 Python 中表达 "override specifier"的相反值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com