[PYTHON] Metaklasse und Instanz

Ursprung

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.

Was ist eine Instanz

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.

Was ist mit der vorherigen Eingabe schief gelaufen?

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.

Wie soll ich dann fragen?

Abgesehen von isinstance gibt es eine Funktion namens issubclass. Sie können dies verwenden.

issublass(Question, Model)

True wird sicher zurückgegeben.

Metaklasse und Instanz

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

Metaklasse und Instanz
Python ist eine Instanz
Über Klasse und Instanz
Python: Klassen- und Instanzvariablen
Was ist eine Instanzvariable?
[Python] Python und Sicherheit - is Was ist Python?
Python-Metaklasse und SQLalchemie deklarativ
Identität und Äquivalenz: ist und == in Python
Ordnungsgemäße Verwendung der Instanzmethode und der Klassenmethode
Unterschied zwischen == und ist in Python
Python-Klassen und -Instanzen, Instanzmethoden
[Python] Was ist Pandas Series und DataFrame?
Ihre Kombination aus Ansible und Serverspezifikation ist falsch!
Start der AWS EC2-Instanz und SSH-Verbindung
Tag 64 Pip Install Tensorflow 2.0 ist da.
Verwendung ist und == in Python