Python: Как мне получить доступ к экземпляру украшенного класса из декоратора класса? - PullRequest
6 голосов
/ 02 февраля 2010

Вот пример того, что я имею в виду:

class MyDecorator(object):    
    def __call__(self, func):
        # At which point would I be able to access the decorated method's parent class's instance?
        # In the below example, I would want to access from here: myinstance
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        return wrapper

class SomeClass(object):
    ##self.name = 'John' #error here
    name="John"

    @MyDecorator()
    def nameprinter(self):
        print(self.name)

myinstance = SomeClass()
myinstance.nameprinter()

Нужно ли украшать реальный класс?

Ответы [ 3 ]

7 голосов
/ 02 февраля 2010
class MyDecorator(object):
    def __call__(self, func):
      def wrapper(that, *args, **kwargs):
        ## you can access the "self" of func here through the "that" parameter
        ## and hence do whatever you want        
        return func(that, *args, **kwargs)
      return wrapper
2 голосов
/ 02 февраля 2010

Обратите внимание, что в этом контексте использование «self» - это просто соглашение, метод просто использует первый аргумент в качестве ссылки на объект экземпляра:

class Example:
  def __init__(foo, a):
    foo.a = a
  def method(bar, b):
    print bar.a, b

e = Example('hello')
e.method('world')
1 голос
/ 02 февраля 2010

Аргумент self передается в качестве первого аргумента. Также ваш MyDecorator является классом, эмулирующим функцию. Проще сделать это актуальной функцией.

def MyDecorator(method):
    def wrapper(self, *args, **kwargs):
        print 'Self is', self
        return method(self, *args, **kwargs)
    return wrapper

class SomeClass(object):
    @MyDecorator
    def f(self):
       return 42

print SomeClass().f()
...