6 Stimmen

Python: Wie greife ich auf die Instanz einer dekorierten Klasse aus einem Klassendekorator heraus zu?

Hier ist ein Beispiel dafür, was ich meine:

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()

Muss ich die eigentliche Klasse dekorieren?

8voto

jldupont Punkte 87330
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

2voto

snies Punkte 3365

Bitte beachten Sie in diesem Zusammenhang, dass die Verwendung von "self" nur eine Konvention ist, eine Methode verwendet lediglich das erste Argument als Verweis auf das Instanzobjekt:

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

e = Example('hello')
e.method('world')

1voto

Das Argument self wird als erstes Argument übergeben. Auch Ihr MyDecorator ist eine Klasse, die eine Funktion emuliert. Es ist einfacher, daraus eine tatsächliche Funktion zu machen.

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()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X