/ / Python - Funktionsargumente direkt an cls () [duplicate] - python übergeben

Python - Funktionsargumente direkt an cls () [duplicate] - python übergeben

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 № 1

Nun, 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.