In Python können Sie innerhalb der Klassenmethode mit dem ersten Argument auf Ihre Klasse verweisen. Das Programmieren ist eine übliche Methode, um Ihre eigene Instanz mithilfe von Klassenmethoden bereitzustellen. Beispielsweise erstellt "datetime.date.today ()" eine Instanz von "datetime.date". Die Klassenmethode übernimmt die Initialisierung mit "Datum (Jahr, Monat, Tag)" und gibt sie zurück.
In Python ist das erste Argument standardmäßig der Aufrufer. Es ist üblich, Variablen "self" für Methoden und "cls" für Klassenmethoden zu benennen.
** ES2015 hat ein Schlüsselwort, das Pythons "@ staticmethod" -Dekorator "static" entspricht, aber kein Schlüsselwort, das "@ classmethod" entspricht. ** ** ** ** Wie es geht **. (Ich bin nicht sicher, ob es mir so passt)
Die Umgebung, die ich ausprobiert habe, war NodeJS v6.1.0. Da es bereits von V8 unterstützt wird, geht es insbesondere nicht durch babel.
Schreiben Sie zunächst ein Python-Codebeispiel.
class X(object):
@classmethod
def create(cls):
return cls()
class Y(X):
pass
x = X.create()
y = Y.create()
print(isinstance(x, X))
print(isinstance(y, X))
print(isinstance(y, Y))
Ausführungsergebnis
True
True
True
class X {
static create() {
return new X();
}
}
class Y extends X {};
const x = X.create();
const y = Y.create();
console.log(x instanceof X);
console.log(y instanceof X);
console.log(y instanceof Y);
Ausführungsergebnis
true
true
false
Weil new X ();
in X
fest codiert wurde
Sogar y
, eine Instanz, die von create ()
des geerbten Y
erstellt wurde,
Es ist eigentlich nur "X" anstelle von "Y".
Dies ist nicht genau das, was Sie wollen.
Versuchen wir eine redundante, aber einfache Strategie, um eine neue statische Methode neu zu definieren.
class X {
static create() {
return new this();
}
}
class Y extends X {
static create() {
return new Y();
}
}
const x = X.create();
const y = Y.create();
console.log(x instanceof X);
console.log(y instanceof X);
console.log(y instanceof Y);
Ausführungsergebnis
true
true
true
Das Ergebnis ist genau das, was Sie wollen.
y
ist eine Instanz von Y
und Y
erbt X
.
Dies erfordert jedoch eine Neudefinition aller Klassenmethoden bei jeder Vererbung.
Daher ist es notwendig, die Definition in der ursprünglichen Klasse zu verfolgen.
Es ist unpraktisch.
Während ich verschiedene Dinge tat, erinnerte ich mich an "das".
Wenn "self" in Python "this" entspricht, würde dann nicht dieselbe Beziehung für Klassenmethoden gelten?
Wenn Sie eine statische Methode aufrufen, die aus einer Klasse mit einem Punktoperator wächst, wird this
zu dieser Klasse ...
Deshalb habe ich es versucht.
class X {
static create() {
return new this();
}
}
class Y extends X {};
const x = X.create();
const y = Y.create();
console.log(x instanceof X);
console.log(y instanceof X);
console.log(y instanceof Y);
Ausführungsergebnis
true
true
true
Wie geplant.
y
ist eine Instanz von Y
und Y
erbt X
.
Es ist nicht erforderlich, "create ()" für "Y" neu zu definieren, da es nicht fest codiert ist.
Recommended Posts