2016-03-08 8 views
0

Удивительно, если кто-то имеет хороший способ динамически осматривать класс для его типов функций, а затем динамически обезьяна патёт декоратора на некоторые из этих функций. Я стараюсь, но не получаю ожидаемых результатов. Прогулка по методам в классе, похоже, работает, но сам патч обезьяны, похоже, терпит неудачу. Любые мысли очень ценятся!Dynamically monkey patch a python 2.7 class

def decorator(callable): 
    pass 

class Test(object): 
    def foo1(self): 
     return self.bar() 

    def foo2(self): 
     return self.blah() 

    def foo3(self): 
     return 0 

for x,y in Test.__dict__.items(): 
     if type(y) == FunctionType: 
      Test.x = decorator(Test.x) 
+1

Этот подход добавления декоратора динамически является полностью действительным. Я также предпочел бы лучший синтаксис Python, но на данный момент все должно быть хорошо. – HelloWorld

ответ

3

Конечно Test.x не существует, и это поднимет AttributeError. Вы можете использовать setattr. Также x.__dict__ выглядит уродливым для меня, вместо этого я бы использовал vars(x).

for x,y in vars(Test).items(): 
    if type(y) == FunctionType: 
     setattr(Test, x, decorator(y)) 

 Смежные вопросы

  • Нет связанных вопросов^_^