En Python, vous pouvez faire référence à votre classe avec le premier argument depuis la méthode de classe.
La programmation est un moyen courant de fournir votre propre instance via des méthodes de classe.
Par exemple, datetime.date.today ()
crée une instance de datetime.date
.
La méthode de classe prend en charge le travail d'initialisation avec date (année, mois, jour)
et la renvoie.
En Python, le premier argument est l'appelant par défaut. Il est courant de nommer les variables «self» pour les méthodes et «cls» pour les méthodes de classe.
** ES2015 a un mot-clé équivalent au décorateur Python @ staticmethod
appelé static
, mais aucun mot-clé équivalent à @ classmethod
. ** **
** Comment faire **. (Je ne sais pas si ça me convient comme ça)
L'environnement que j'ai essayé était NodeJS v6.1.0. Puisqu'il est déjà supporté par le V8, il ne passe pas par babel en particulier.
Tout d'abord, écrivez un exemple de code 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))
Résultat d'exécution
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);
Résultat d'exécution
true
true
false
Parce que new X ();
a été codé en dur dans X
Même «y», qui est une instance créée par «create ()» du «Y» hérité,
C'est en fait juste «X» au lieu de «Y».
Ce n'est pas exactement ce que vous voulez.
Essayons une stratégie redondante mais simple pour redéfinir une nouvelle méthode statique.
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);
Résultat d'exécution
true
true
true
Le résultat est exactement ce que vous voulez. «y» est une instance de «Y» et «Y» hérite de «X». Cependant, cela nécessite de redéfinir toutes les méthodes de classe à chaque fois qu'elle est héritée. Par conséquent, il est nécessaire de garder une trace de la définition dans la classe d'origine. C'est gênant.
Ainsi, en faisant diverses choses, je me suis souvenu de «ceci».
Si «self» en Python correspond à «this», la même relation ne serait-elle pas valable pour les méthodes de classe?
Eh bien, si vous appelez une méthode statique qui se développe à partir d'une classe avec un opérateur point, this
devient cette classe ...
C'est pourquoi je l'ai essayé.
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);
Résultat d'exécution
true
true
true
Comme prévu.
«y» est une instance de «Y» et «Y» hérite de «X».
Il n'est pas nécessaire de redéfinir create ()
pour Y
car il n'est pas codé en dur.