Ändern Sie ein Attribut einer Funktion in seinem eigenen Körper?

Ich versuche, eine Funktion zu erstellen, die die Anzahl der Zeiten, die es genannt wurde, beibehalten wird, und ich möchte, dass die Informationen in der Funktion selbst bleiben. Ich habe versucht, so einen Wrapper zu schaffen:

def keep_count(f): f.count = 0 @functools.wraps(f) def wrapped_f(*args, **kwargs): f(*args, **kwargs) f.count += 1 return wrapped_f @keep_count def test_f(*args, **kwargs): print(args, kwargs) 

Ich dachte, es würde funktionieren, aber ich bekam ein AttributeError sagen 'function' object has no attribute 'count' .

Ich habe schon das Problem gedacht: Es ist, weil der Dekorateur mein test_f gleich dem wrapped_f (definiert in der keep_count Dekorateur), und ich bin die Erhöhung der Zählung des Originals f , die nicht mehr verwendet wird, da test_f bezieht sich auf die neue Funktion .

Gibt es einen Weg, dies zu tun, ohne zu viel von Hacken?

One Solution collect form web for “Ändern Sie ein Attribut einer Funktion in seinem eigenen Körper?”

wrapped_f einfach das Attribut auf wrapped_f anstelle von f . Dies erfordert, dass Sie die Anfangszählung nach der Definition der Funktion setzen, aber das ist keine große Sache:

 def keep_count(f): @functools.wraps(f) def wrapped_f(*args, **kwargs): f(*args, **kwargs) wrapped_f.count += 1 wrapped_f.count = 0 return wrapped_f 

Dann mit deiner geschmückten Funktion:

 >>> test_f() () {} >>> test_f.count 1 >>> test_f() () {} >>> test_f.count 2 

Dies funktioniert, weil wrapped_f eine lokale Variable innerhalb von keep_count . Da der Körper von wrapped_f einen Verweis auf wrapped_f , bekommt es eine Schließung, die wrapped_f erlaubt, auf sich selbst zuzugreifen.

  • Python: Unicode und ElementTree.parse
  • Tupel Auspacken für Schleifen
  • Python CSV Leser, um 9 Header zu überspringen
  • Wie kann ich python zu cmd in windows hinzufügen
  • Python auf Mac aktualisieren
  • Asterisk-Dreieck in Python
  • REST: Glassdoor API benötigt User-Agent im Header
  • Wie installiere ich pip3 unter Windows?
  • Um eine Schaltfläche zu erstellen, wenn gedrückt wird, drücken Sie die Nummer auf dieser Schaltfläche im Eingabefeld in python 3.3
  • So verschieben Sie Dateien, die in einer Textdatei von einem Ordner zum anderen in python aufgeführt werden
  • Das Pycharm-Terminal ändert die Python-Version nicht entsprechend der Python-Version bei Project Interpreter
  • Python ist die beste Programmiersprache der Welt.