Ich bin auf einen Code-Ausschnitt wie folgt gestoßen -
@classmethod
def new(cls, **props):
"""Creates a new Thread instance, ensuring a unique _id."""
for i in range(5):
try:
thread = cls(**props)
session(thread).flush(thread)
return thread
...... continued
Der Name der Klasse, die definiert wird, lautet "Thread". Dieser Code erstellt ein neues Thread-Objekt, aber ich kann nicht verstehen, wie dieser bestimmte Code dies aus dem Code im try-Block versucht.
cls ist eine funktion?
Antworten:
2 für die Antwort № 1Nun, da Sie Ihre Frage bearbeitet haben, ist klar, was passiert. Sie haben einen Dekorateur @classmethod. Laut den Unterlagen:
Eine Klassenmethode erhält die Klasse nur als implizites erstes Argument wie eine Instanzmethode erhält die Instanz. Eine Klasse deklarieren Methode, verwenden Sie diese Redewendung:
class C: @classmethod def f(cls, arg1, arg2, ...): ...
Dies ist (etwas) äquivalent dazu:
class MyClass:
def f(self, arg1, arg2, ...):
cls = self.__class__
...
Klassen in Python sind aufrufbar (sie können beispielsweise mit aufgerufen werden Class()
). Diese beiden Dinge sind daher gleichwertig:
a = MyClass()
und
cls = MyClass
b = cls()
Zusammenfassend, cls
ist keine Funktion, sondern eine aufrufbare Funktion. Übrigens Sie können jedes Objekt zum Aufruf machen, indem Sie die spezielle Methode hinzufügen __call__
:
class A:
def __call__(self):
print("Woah!")
a = A()
a() # prints Woah!
1 für die Antwort № 2
Es scheint, dass das erste Argument eine Klasse ist und das zweite eine Menge von Argumenten mit Schlüsselwerten ist (siehe Diese Frage beschreibt die Doppelsternnotation).
Innerhalb der Funktion werden die Schlüsselwert-Argumente dann an den Klassenkonstruktor übergeben, um die Variable als Thread zu definieren.