Django verwendet die Metaklasse ModelBase für Modelle (django.db.models.Model), um verschiedene Registrierungsprozesse durchzuführen.
Also habe ich die Quelle gelesen
class ModelBase(type):
def __new__(cls, name, bases, attrs):
parents = [b for b in bases if isinstance(b, ModelBase)]
Es gab einen Code wie diesen, also als ich "is instance (Question, Model)" [^ 1] mit "Hmm" und Shell eingab,
False
[^ 1]: Frage ist eine Klasse, die Model erbt. Mit anderen Worten, Djangos Modellklasse
Wenn Sie sorgfältig darüber nachdenken, können Sie es verstehen, aber zuerst dachte ich "das?", Also werde ich zusammenfassen, was ich verstanden habe.
isinstance gibt True zurück, wenn das erste Argument ** object ** eine Instanz des zweiten Arguments ** class ** ist .. Zum Beispiel
isinstance(123, int)
Gibt True zurück.
Frage ist ** Klasse **, Modell ist auch ** Klasse **. Mit anderen Worten, Sie werden gefragt: "Ist die Question-Klasse eine Instanz der Model-Klasse?" Nicht so etwas. Es überrascht nicht, dass False zurückgegeben wird. Unterklassen und Instanzen wurden durcheinander gebracht.
Abgesehen von isinstance gibt es eine Funktion namens issubclass. Sie können dies verwenden.
issublass(Question, Model)
True wird sicher zurückgegeben.
Kehren wir zur Django-Quelle zurück. In der Django-Quelle habe ich geprüft, ob die Oberklassen der "zu erstellenden Klassen" Instanzen von ModelBase [^ 2] sind. Das erste Argument ist ** Klasse **. Der Grund dafür ist, dass das zweite Argument eine ** Metaklasse ** ist, die den Typ erbt. ** Da die Instanz der Meta-Klasse eine Klasse ist **, ist diese Prüfung True, wenn die Klasse die Model-Klasse erbt. Das heißt, der folgende Ausdruck gibt True zurück.
isinstance(Question, ModelBase)
[^ 2]: Es scheint, dass Sie eine abstrakte Modellklasse erstellen können, die allgemeine Attribute in der Anwendung definiert. Ist es jedoch praktisch, eine so komplizierte Modellhierarchie zu erstellen?
Recommended Posts