如果我使用的是模块/类,我无法控制,我将如何装饰其中一种方法?
我知道我可以:my_decorate_method(target_method)()
但是我希望在无需进行搜索/替换的情况下调用target_method
的地方就能实现这一点。
甚至可能吗?
答案 0 :(得分:8)
不要这样做。
使用继承。
import some_module
class MyVersionOfAClass( some_module.AClass ):
def someMethod( self, *args, **kwargs ):
# do your "decoration" here.
super( MyVersionOfAClass, self ). someMethod( *args, **kwargs )
# you can also do "decoration" here.
现在,修复主程序以使用MyVersionOfAClass
代替some_module.AClass
。
答案 1 :(得分:3)
是的,这是可能的,但有几个问题。 首先,你以明显的方式从类中获取方法,你得到一个warper对象,但不是函数本身。
class X(object):
def m(self,x):
print x
print X.m #>>> <unbound method X.m>
print vars(X)['m'] #>>> <function m at 0x9e17e64>
def increase_decorator(function):
return lambda self,x: function(self,x+1)
其次我不知道设置新方法是否始终有效:
x = X()
x.m(1) #>>> 1
X.m = increase_decorator( vars(X)['m'] )
x.m(1) #>>> 2