Как я могу добавить декоратор к существующему объектному методу? - PullRequest
8 голосов
/ 14 сентября 2009

Если я использую модуль / класс, над которым у меня нет контроля, как бы я украсил один из методов?

Я понимаю, что могу: my_decorate_method(target_method)() но я надеюсь, что это произойдет везде, где вызывается target_method без необходимости выполнять поиск / замену.

Возможно ли это вообще?

Ответы [ 2 ]

8 голосов
/ 14 сентября 2009

Не делай этого.

Использовать наследование.

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 голосов
/ 14 сентября 2009

Да, это возможно, но есть несколько проблем. Во-первых, когда вы получаете метод из класса очевидным образом, вы получаете объект деформации, но не саму функцию.

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
...