[PYTHON] Métaclasse et isinstance

Origine

Django utilise la métaclasse ModelBase pour les modèles (django.db.models.Model) pour effectuer divers processus d'enregistrement.

Alors je lisais la source

class ModelBase(type):
    def __new__(cls, name, bases, attrs):
        parents = [b for b in bases if isinstance(b, ModelBase)]

Il y avait un code comme celui-ci, donc quand j'ai tapé ʻis instance (Question, Model) `[^ 1] avec" Hmm "et shell,

False

[^ 1]: Question est une classe qui hérite de Model. En d'autres termes, la classe de modèle de Django

Si vous y réfléchissez bien, vous pouvez le comprendre, mais au début j'ai pensé "ça?", Donc je vais résumer ce que j'ai compris.

Qu'est-ce que l'instance

isinstance renvoie True si le premier argument ** object ** est une instance du deuxième argument ** class ** .. Par exemple

isinstance(123, int)

Renvoie True.

Qu'est-ce qui n'a pas fonctionné avec l'entrée précédente

La question est ** classe **, le modèle est également ** classe **. En d'autres termes, il vous sera demandé: "La classe Question est-elle une instance de la classe Model?" Ça n'existe pas. Sans surprise, False est renvoyé. Les sous-classes et les instances étaient en désordre.

Alors comment devrais-je demander

En dehors de cette instance, il existe une fonction appelée issubclass. Vous pouvez utiliser ceci.

issublass(Question, Model)

True est renvoyé en toute sécurité.

Métaclasse et isinstance

isinstance(Question, ModelBase)

Recommended Posts

Métaclasse et isinstance
Python est une instance
À propos de la classe et de l'instance
Python: variables de classe et d'instance
Qu'est-ce qu'une variable d'instance?
[Python] Python et sécurité-① Qu'est-ce que Python?
métaclasse python et déclaration sqlalchemy
Identité et équivalence: is et == en Python
Utilisation correcte de la méthode d'instance et de la méthode de classe
Différence entre == et est en python
Classes et instances Python, méthodes d'instance
[Python] Qu'est-ce que la série pandas et DataFrame?
Votre combinaison ansible et serverspec est fausse!
Lancement de l'instance AWS EC2 et connexion SSH
Le jour 64 de l'installation de pip tensorflow 2.0 est arrivé.
Comment utiliser is et == en Python