Nicht viele kennen diese Funktion, aber Pythons Funktionen (und Methoden) können Attribute haben . Erblicken:
>>> def foo(x):
... pass
...
>>> foo.score = 10
>>> dir(foo)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name', 'score']
>>> foo.score
10
>>> foo.score += 1
>>> foo.score
11
Was sind die möglichen Verwendungen und Missbräuche dieser Funktion in Python? Eine gute Verwendung, die mir bekannt ist , ist die Verwendung der Dokumentzeichenfolge durch PLY , um einer Methode eine Syntaxregel zuzuordnen. Aber was ist mit benutzerdefinierten Attributen? Gibt es gute Gründe, sie zu benutzen?
python
function
attributes
Eli Bendersky
quelle
quelle
Antworten:
Normalerweise verwende ich Funktionsattribute als Speicher für Anmerkungen. Angenommen, ich möchte im Stil von C # schreiben (was darauf hinweist, dass eine bestimmte Methode Teil der Webdienstschnittstelle sein sollte).
dann kann ich definieren
Wenn dann ein Webservice-Aufruf eintrifft, schaue ich nach der Methode, überprüfe, ob die zugrunde liegende Funktion das Attribut is_webmethod hat (der tatsächliche Wert ist irrelevant), und lehne den Service ab, wenn die Methode fehlt oder nicht über das Web aufgerufen werden soll.
quelle
.__doc__
Ich habe sie als statische Variablen für eine Funktion verwendet. Beispiel: Geben Sie den folgenden C-Code ein:
Ich kann die Funktion in Python ähnlich implementieren:
Dies würde definitiv in das Ende des Spektrums "Missbrauch" fallen.
quelle
Sie können Objekte auf JavaScript-Weise erstellen ... Es macht keinen Sinn, aber es funktioniert;)
quelle
def test()
wirklich notwendig?Ich benutze sie sparsam, aber sie können ziemlich praktisch sein:
Jetzt kann ich
log
mein Modul verwenden und die Ausgabe einfach durch Einstellen umleitenlog.logfile
. Es gibt viele, viele andere Möglichkeiten, dies zu erreichen, aber dieses ist leicht und schmutzig einfach. Und obwohl es beim ersten Mal komisch roch, habe ich geglaubt, dass es besser riecht als eine globalelogfile
Variable.quelle
Funktionsattribute können verwendet werden, um leichte Verschlüsse zu schreiben, die Code und zugehörige Daten zusammenfassen:
1.00934004784
2.00644397736
3.01593494415
quelle
time.sleep(1)
ist besser alsos.system('sleep 1')
Ich habe diesen Hilfsdekorator erstellt, um Funktionsattribute einfach festzulegen:
Ein Anwendungsfall besteht darin, eine Sammlung von Fabriken zu erstellen und den Datentyp abzufragen, den sie auf Funktionsmetaebene erstellen können.
Zum Beispiel (sehr dumm):
quelle
factory1.datatype=list
wie Dekorateure alten Stils direkt unter die Erklärung setzen?items()
anstelle von verwendeniteritems()
.Manchmal verwende ich ein Attribut einer Funktion zum Zwischenspeichern bereits berechneter Werte. Sie können auch einen generischen Dekorateur haben, der diesen Ansatz verallgemeinert. Beachten Sie Parallelitätsprobleme und Nebenwirkungen solcher Funktionen!
quelle
Ich war immer der Annahme, dass der einzige Grund, warum dies möglich war, darin bestand, dass es einen logischen Ort gab, an dem ein Doc-String oder ähnliches eingefügt werden konnte. Ich weiß, wenn ich es für einen Produktionscode verwenden würde, würde es die meisten, die es lesen, verwirren.
quelle