Verwenden Sie type(), um Klassen dynamisch zu erstellen
Da Klassen auch Objekte sind, können wir Klassen erstellen, während das Programm läuft. Python ist eine dynamische Sprache. Der größte Unterschied zwischen dynamischen Sprachen und statischen Sprachen besteht darin, dass die Definitionen von Funktionen und Klassen nicht zur Kompilierungszeit definiert, sondern zur Laufzeit dynamisch erstellt werden. Zuvor verstehen wir zunächst die Funktion type().
Zuerst erstellen wir ein hello.py-Modul und definieren dann eine Hello-Klasse,
class Hello(object): def hello(self, name='Py'): print('Hello,', name)
Dann verweisen wir auf das Hallo-Modul in einem anderen Modul und geben die entsprechenden Informationen aus. Die Funktion type() wird verwendet, um den Typ eines Typs und einer Variablen anzuzeigen.
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- from com.twowater.hello import Hello h = Hello() h.hello() print(type(Hello)) print(type(h))
Was ist das Ausgabeergebnis?
Hello, Py <class 'type'> <class 'com.twowater.hello.Hello'>
Wie oben erwähnt, kann die Funktion type() den Typ eines Typs oder einer Variablen überprüfen. Hallo ist eine Klasse, ihr Typ ist Typ und h ist eine Instanz, ihr Typ ist com.twowater .hello .Hallo. Das vorherige com.twowater ist mein Paketname, und das Hallo-Modul befindet sich unter diesem Paketnamen.
Denken Sie hier mehr darüber nach. Im obigen Beispiel verwenden wir die Funktion type(), um den Typ eines Typs oder einer Variablen zu überprüfen. Der Typ einer Hello-Klasse wird überprüft und das gedruckte Ergebnis ist: <class 'type'> Tatsächlich kann die Funktion type() nicht nur den Typ eines Objekts zurückgeben, sondern auch neue Typen erstellen. Die Definition einer Klasse wird dynamisch zur Laufzeit erstellt. Die Erstellung einer Klasse erfolgt über die Funktion type(). Beispielsweise können wir die Hello-Klasse im obigen Beispiel über die Funktion type() erstellen. Weitere Informationen finden Sie im folgenden Code:
# -*- coding: UTF-8 -*- def printHello(self, name='Py'): # 定义一个打印 Hello 的函数 print('Hello,', name) # 创建一个 Hello 类 Hello = type('Hello', (object,), dict(hello=printHello)) # 实例化 Hello 类 h = Hello() # 调用 Hello 类的方法 h.hello() # 查看 Hello class 的类型 print(type(Hello)) # 查看实例 h 的类型 print(type(h))
Das Ausgabeergebnis lautet wie folgt:
Hello, Py <class 'type'> <class '__main__.Hello'>
Hier: Sie müssen zuerst die Parameterbeschreibung der Funktion type() verstehen, um ein Klassenobjekt zu erstellen:
1 Der Name der Klasse, wie der Name im Beispiel Hallo
Eine Sammlung geerbter übergeordneter Klassen. Wenn es nur eine übergeordnete Klasse gibt, muss das Tupel mit einem einzelnen Element geschrieben werden Da es sich um ein Einzelelement-Tupel handelt, wird es als (Objekt) geschrieben.
3 Der Methodenname der Klasse ist an die Funktion gebunden, im Beispiel ist die Funktion printHello an die Methode gebunden Name hallo Das spezifische Muster in
lautet wie folgt:
Typ (Klassenname, Tupel der übergeordneten Klasse (kann zur Vererbung leer sein), Wörterbuch mit Attributen (Name und Wert))
Okay, nachdem wir die spezifische Parameterverwendung verstanden haben, schauen wir uns die Ausgabeergebnisse an. Wir können sehen, dass die durch die Funktion type() erstellte Klasse genau das Gleiche ist wie das direkte Schreiben der Klasse, da Python Wenn der Interpreter auf eine Klassendefinition stößt, scannt er lediglich die Syntax der Klassendefinition und ruft dann die Funktion type() auf, um die Klasse zu erstellen.
Aber im Allgemeinen verwenden wir die Methode class ***..., um Klassen zu definieren, aber mit der Funktion type() können wir auch Klassen erstellen. Mit anderen Worten: Eine dynamische Sprache selbst unterstützt die dynamische Erstellung von Klassen während der Laufzeit, was sich stark von einer statischen Sprache unterscheidet. Um eine Klasse während der Laufzeit einer statischen Sprache zu erstellen, müssen Sie eine Quellcodezeichenfolge erstellen und dann den Compiler aufrufen , oder verwenden Sie einige Tools, um einen Wortabschnitt zu generieren Code-Implementierung ist im Wesentlichen eine dynamische Kompilierung, die sehr kompliziert sein kann.
Wie Sie sehen, sind Klassen in Python auch Objekte und Sie können Klassen dynamisch erstellen. Tatsächlich ist es genau das, was Python hinter den Kulissen tut, wenn Sie das Schlüsselwort class verwenden, und dies wird durch Metaklassen erreicht.