gpt4 book ai didi

python - 装饰子类方法

转载 作者:行者123 更新时间:2023-11-28 21:59:22 25 4
gpt4 key购买 nike

假设我有一个类 Foo。我写了一个装饰器 deco 我想应用到 Foo 类的一些方法上。由于 Foo 是从库中导入的,因此我决定将其子类化为 Bar。现在,我唯一需要做的就是将装饰器添加到 Foo 的一些方法中。

class Bar(Foo):

@deco
def aMethod(self, *args, **kwargs):
super().aMethod(*args, **kwargs)

因为我不需要修改aMethod的代码,有没有更简单的方法来装饰它,而不需要显式调用super()

最佳答案

您可以通过将方法替换为装饰版本来对 Foo 进行 monkeypatch:

Foo.aMethod = deco(Foo.aMethod)

装饰器语法只是语法糖,毕竟 deco 只是一个可调用对象,它的结果替换了装饰函数:

@deco
def aMethod(...):
....

有效地翻译成:

def aMethod(....):
...
aMethod = deco(aMethod)

或者,如果您仍然喜欢使用子类,请在类的主体中执行相同的操作:

class Bar(Foo):
aMethod = deco(Foo.aMethod)

在 Python 2 中,您需要先解包函数:

Foo.aMethod = deco(Foo.aMethod.im_func)

关于python - 装饰子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16800335/

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