2017-07-13 2 views
1

Ich versuche, ein Dekorateur für eine Instanz Methode zu schreiben, wie folgt:Python Dekorator für Klassenmethode und statische Methode?

from functools import wraps 

def plus_decorator(f): 
    @wraps(f) 
    def wrapper(*args, **kwargs): 
     return 1 + f(*args, **kwargs) 
    return wrapper 

@plus_decorator 
def return_i(i): 
    return i 

class A(object): 
    @plus_decorator 
    def return_i(self, i): 
     return i 

    @plus_decorator 
    @classmethod 
    def return_i_class(cls, i): 
     return i 

    @plus_decorator 
    @staticmethod 
    def return_i_static(i): 
     return i 

if __name__ == '__main__': 
    print return_i(1) 
    a = A() 
    print a.return_i(1) 
    print A.return_i_class(1) 
    print A.return_i_static(1) 

Allerdings erscheint es den Fehler auf:

AttributeError: 'classmethod' object has no attribute '__module__' 

Ich frage mich, warum der Dekorateur funktioniert nicht auf classmethod und staticmethod. Ich denke, der Decorator übergibt alle Parameter, die er erhält, nur an den Wrapper und ändert nur das Ergebnis. Wie kann ich den Decorator ändern, damit er für und staticmethod funktioniert?

+0

Wie sieht Ihre Callsite aus? – Will

+0

Das funktioniert gut. Sie erstellen keine Instanz von 'A()', um sie aufzurufen, z. 'a = A(); a.return_i (1) '. Vielleicht brauchst du auch '@ classmethod'? – AChampion

+0

Hoppla. Der ursprüngliche Fehler, den ich traf, war Dekorator für die Klassenmethode, und irgendwie habe ich die Callsite für die Instanzmethode vermasselt. Lass mich den Inhalt ändern. –

Antwort

0

Umdrehen Sie einfach den Auftrag. Setzen Sie die @classmethod oder @staticmethod auf der Außenseite, und Ihre Dekorateur (die @wraps verwendet, und benötigt daher eine nackte Funktion) auf der Innenseite.

@classmethod 
@plus_decorator 
def return_i_class(cls, i): 
    return i 
0

Versuchen Sie, umzukehren.

Es wird funktionieren, wenn @staticmethod und @classmethod meisten Top-Dekorateure sind als here

erklärt Weil Ihr Dekorateur eine Funktion aber beide zurückgeben Objekte Descriptor die anderen Dekorateure erwartet.

Verwandte Themen