![](/img/trans.png)
[英]How do I decorate an instance method with another class in Python 2.7?
[英]Python, how to alter a method of another class' instance
我想为另一个类实例的方法添加一些小功能。 下面列出了我尝试过的内容。 使用相同的方法,可以完全改变方法。 但我想保留原始方法的略微改动版本。 那可能吗?
顺便说一句:这些类不能相互继承,因为我不一定知道 class B 是什么。
class A:
def alter_fn(self, obj):
def wrapper():
func = getattr(obj, obj.fn_name)
out = func()
print('out = ', out)
return out
setattr(obj, obj.fn_name, wrapper)
return
class B:
def __init__(self) -> None:
self.fn_name = 'fn'
def fn(self):
return 123
a=A()
b=B()
a.alter_fn(b)
b.fn()
由于显而易见的原因,这会引发递归深度错误,但我不知道如何避免这种情况。 我也试过func = copy(getattr(obj, obj.fn_name))
更改方法 b.fn 后,我希望它返回值,未更改的 function 将返回(此处为 123),但我也希望它对 output 执行其他操作,在此示例中打印它。
将func
的赋值移到wrapper
的定义之上。
...
def alter_fn(self, obj):
func = getattr(obj, obj.fn_name)
def wrapper():
...
这样getattr
只被调用一次,并且wrapper
可以将func
作为闭包变量访问。
您只需将func = getattr(obj, obj.fn_name)
从wrapper
function 中取出。
class A:
def alter_fn(self, obj):
func = getattr(obj, obj.fn_name)
def wrapper():
out = func()
print('out = ', out)
return out
setattr(obj, obj.fn_name, wrapper)
return
您需要在重新分配之前获取包装的 function :
def alter_fn(self, obj):
func = getattr(obj, obj.fn_name)
def wrapper():
out = func()
print('out = ', out)
return out
setattr(obj, obj.fn_name, wrapper)
return
这种方式func
只分配一次,当原始的 function 被调用时。 因此,您可以安全地调用它,而不会意外再次调用wrapper()
。
还可以考虑使用functools.wraps()
来保持字符串的文档字符串和名称信息相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.