2015-12-12 3 views
0

я пишу декоратор для метода классаPython метод класса декоратор

def decor(method): 
    def wrapped(self, *args, **kwargs): 
     return method(self, *args, **kwargs) 
    # [*] 
    return wrapped 

Я хотел бы использовать это как:

class A(metaclass=mymetaclass): 
    @decor 
    def meth(self): 
     pass 

Как я могу в декоратора добавить метод/переменную в класс, который украшен метод ? Мне нужно это около [*]. Внутри завернутый я мог написать self.__class__, но что здесь делать?

+0

Вы можете использовать 'method.im_class' http://stackoverflow.com/questions/7680446/get-python-functions-owning-class-from-decorator –

ответ

3

Я не могу представить себе способ удовлетворения такого требования, потому что функция decor получает только объект функции, который ничего не знает о содержащем классе.

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

def decor(cls): 
    def wrapper(method): 
     def wrapped(self, *args, **kwargs): 
      return self.method(*args, **kwargs) 
     print method # only a function object here 
     return wrapped 
    print cls # here we get the class and can manipulate it 
    return wrapper 

class A 
    @decor(A) 
    def method(self): 
     pass 

В качестве альтернативы, вы можете украсить сам класс:

def cdecor(cls): 
    print 'Decorating', cls # here we get the class and can manipulate it 
    return cls 

@cdecor 
class B: 
    def meth(self): 
     pass 

дает:

Decorating __main__.B 
0

Похоже, что это невозможно, в соответствии с этим разрешением Понс:

Get Python function's owning class from decorator

Что вы могли бы сделать вместо этого предоставляет декоратор для вашего класса, что-то вроде этого:

class InsertMethod(object): 
    def __init__(self, methodToInsert): 
     self.methodToInsert = methodToInsert 

    def __call__(self, classObject): 
     def wrapper(*args, **kwargs): 
      setattr(classObject, self.methodToInsert.__name__, self.methodToInsert) 
      return classObject(*args, **kwargs) 
     return wrapper 

def IWillBeInserted(self): 
    print "Success" 


@InsertMethod(IWillBeInserted) 
class Something(object): 
    def __init__(self): 
     pass 

    def action(self): 
     self.IWillBeInserted() 


a = Something() 
a.action() 
0

На самом деле, вы можете украсить сам класс:

def class_decorator(class_): 
    class_.attribute = 'value' 
    class_.method = decorate(class_.method) 
    return class_ 

@class_decorator 
class MyClass: 
    def method(self): 
     pass 
Смежные вопросы