Sollte ich dies verwenden, um meine Klasse in einer statischen Methode wie @classmethod in Python in ES2015 zu referenzieren?

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.

Beispiel in Python

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

Fehlerbeispiel in JavaScript (ES2015)

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.

Erfolgreiches Beispiel in JavaScript (ES2015) (redundante Version)

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.

Erfolgreiches Beispiel mit JavaScript (ES2015)

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

Sollte ich dies verwenden, um meine Klasse in einer statischen Methode wie @classmethod in Python in ES2015 zu referenzieren?
Ich habe versucht, eine Klasse für die Suche nach Dateien mit der Glob-Methode von Python in VBA zu erstellen
Verwendung der Methode __call__ in der Python-Klasse
Ich möchte die Django Debug Toolbar in Ajax-Anwendungen verwenden
Ein Memorandum, weil ich beim Versuch, MeCab mit Python zu verwenden, gestolpert bin
Was soll ich verwenden, um Typvergleiche in Python durchzuführen?
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Ich möchte in der Einschlussnotation drucken
Verwendung von __slots__ in der Python-Klasse
Verwenden Sie Python 3 Subprocess.run () im CGI-Skript
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Ich musste im Unterricht keinen Dekorateur schreiben. Danke Kontextmanager