【发布时间】:2010-11-28 01:47:56
【问题描述】:
如果我正在使用我无法控制的模块/类,我将如何装饰其中一种方法?
我知道我可以:my_decorate_method(target_method)(),但我希望在调用 target_method 的任何地方都能发生这种情况,而无需进行搜索/替换。
有可能吗?
【问题讨论】:
如果我正在使用我无法控制的模块/类,我将如何装饰其中一种方法?
我知道我可以:my_decorate_method(target_method)(),但我希望在调用 target_method 的任何地方都能发生这种情况,而无需进行搜索/替换。
有可能吗?
【问题讨论】:
不要这样做。
使用继承。
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。
【讨论】:
是的,这是可能的,但有几个问题。 首先,你从类中获取方法,显然你得到的是一个变形对象,而不是函数本身。
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
【讨论】: