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?
Wie sieht Ihre Callsite aus? – Will
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
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. –