Wie kann ich dekorieren Sie eine Instanz-Methode mit einem decorator-Klasse?

Betrachten dieses kleine Beispiel:

import datetime as dt

class Timed(object):
    def __init__(self, f):
        self.func = f

    def __call__(self, *args, **kwargs):
        start = dt.datetime.now()
        ret = self.func(*args, **kwargs)
        time = dt.datetime.now() - start
        ret["time"] = time
        return ret

class Test(object):
    def __init__(self):
        super(Test, self).__init__()

    @Timed
    def decorated(self, *args, **kwargs):
        print(self)
        print(args)
        print(kwargs)
        return dict()

    def call_deco(self):
        self.decorated("Hello", world="World")

if __name__ == "__main__":
    t = Test()
    ret = t.call_deco()

dem Drucke

Hello
()
{'world': 'World'}

Warum ist die self parameter (das sollten die Test obj-Instanz) nicht bestanden, der als erstes argument an die eingerichtete Funktion decorated?

Wenn ich es manuell mache, wie :

def call_deco(self):
    self.decorated(self, "Hello", world="World")

funktioniert es wie erwartet. Aber wenn ich muss im Voraus wissen, ob eine Funktion eingerichtet ist oder nicht, es Niederlagen der ganze Zweck der Dekorateure. Was ist das Muster, hier zu gehen, oder mache ich etwas falsch verstanden?

Eine schnelle google auftaucht: thecodeship.com/patterns/guide-to-python-function-decorators (siehe Abschnitt "Dekorieren Methoden")
Haben Sie gelesen, z.B. stackoverflow.com/q/2365701/3001761, stackoverflow.com/q/15098424/3001761
Du wirst nicht auf diese Art von problem, wenn Sie eine Funktion als Dekorator statt eines callable-Objekts.

InformationsquelleAutor Rafael T | 2015-05-07

Schreibe einen Kommentar