Может ли Python-декоратор метода экземпляра получить доступ к классу? - PullRequest
93 голосов
/ 02 марта 2010

Привет, у меня есть что-то вроде следующего. В основном мне нужно получить доступ к классу метода экземпляра из декоратора, используемого для метода экземпляра в его определении.

def decorator(view):
    # do something that requires view's class
    print view.im_class
    return view

class ModelA(object):
    @decorator
    def a_method(self):
        # do some stuff
        pass

Код как есть дает

AttributeError: 'function' object has no attribute 'im_class'

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

Спасибо.

Ответы [ 11 ]

0 голосов
/ 03 марта 2010

У вас будет доступ к классу объекта, для которого вызывается метод в украшенном методе, который должен вернуть ваш декоратор. Вот так:

def decorator(method):
    # do something that requires view's class
    def decorated(self, *args, **kwargs):
        print 'My class is %s' % self.__class__
        method(self, *args, **kwargs)
    return decorated

Используя ваш класс ModelA, вот что он делает:

>>> obj = ModelA()
>>> obj.a_method()
My class is <class '__main__.ModelA'>
...