如何为现有对象方法添加装饰器?

10 投票
2 回答
3510 浏览
提问于 2025-04-15 14:18

如果我在使用一个我无法控制的模块或类,我该怎么给它的某个方法加装饰器呢?

我明白我可以这样做:my_decorate_method(target_method)(),但是我希望在每次调用target_method的时候都能自动加上装饰器,而不需要去一个个搜索和替换。

这样做有可能吗?

2 个回答

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

3

是的,这是可能的,但有几个问题。首先,当你以明显的方式从类中获取方法时,你得到的是一个包装对象,而不是方法本身。

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

撰写回答