Как я могу добавить декоратора к существующему методу объекта?

Я - большой поклонник использования программ Python как файлы конфигурации, специально для демонов. Мне нравится брать курс создания демона, абсолютно пустого от конфигурации за исключением "конфигурационного порта". Программа Python тогда соединяется с демоном и продолжает создавать объекты в демоне и соединять их проводом вместе для создания желаемой конфигурации. Как только все настраивается, демона можно тогда оставить работать свой собственный. Преимущества, конечно, то, что Вы заставляете абсолютный язык программирования писать Ваши файлы конфигурации и так как у Вас уже есть способ говорить с демоном из другой программы, можно использовать ее для отладки и получения статистики. Главная оборотная сторона должна иметь дело с сообщениями из другой программы, входящей в любое время.

8
задан Phillip B Oldham 14 September 2009 в 09:16
поделиться

2 ответа

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

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
3
ответ дан 5 December 2019 в 15:25
поделиться

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

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

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

8
ответ дан 5 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: