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.
isinstance renvoie True si le premier argument ** object ** est une instance du deuxième argument ** class ** .. Par exemple
isinstance(123, int)
Renvoie True.
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.
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é.
isinstance(Question, ModelBase)
Recommended Posts