Dois-je l'utiliser pour faire référence à ma classe dans une méthode statique comme @classmethod en Python dans ES2015?

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.

Exemple en 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

Exemple d'échec en 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);

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.

Exemple réussi en JavaScript (ES2015) (version redondante)

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.

Exemple réussi avec JavaScript (ES2015)

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.

Recommended Posts

Dois-je l'utiliser pour faire référence à ma classe dans une méthode statique comme @classmethod en Python dans ES2015?
J'ai essayé de créer une classe pour rechercher des fichiers avec la méthode Glob de Python dans VBA
Comment utiliser la méthode __call__ dans la classe Python
Je souhaite utiliser Django Debug Toolbar dans les applications Ajax
Un mémorandum parce que j'ai trébuché en essayant d'utiliser MeCab avec Python
Après tout, que dois-je utiliser pour faire des comparaisons de types en Python?
[Introduction à Python] Comment utiliser la classe en Python?
Je veux imprimer dans la notation d'inclusion
Comment utiliser __slots__ dans la classe Python
Utilisez Python 3 Subprocess.run () dans le script CGI
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
Je n'ai pas eu besoin d'écrire décorateur en classe Merci contextmanager