In Python können wir die Typfunktion verwenden, um dynamisch eine Metaklasse zu erstellen. Wir können auch das Attribut __metaclass__ verwenden, um eine Metaklasse anzugeben. Als Nächstes geben wir spezifische Beispiele, um die Erstellung und Verwendung von Metaklassen in Python zu erläutern >
Mit Metaklassen können Sie definieren, wie bestimmte Klassen erstellt werden. Im Grunde gibt es Ihnen die Kontrolle darüber, wie Ihre Klassen erstellt werden.Metaklasse ist auch eine Klasse, eine Typklasse.
Metaklassen werden im Allgemeinen zum Erstellen von Klassen verwendet. Beim Ausführen einer Klassendefinition muss der Interpreter die richtige Metaklasse für diese Klasse kennen. Wenn dieses Attribut nicht definiert ist, sucht er nach dem Attribut __metaclass__ in der übergeordneten Klasse. Wenn es noch nicht gefunden wurde, suchen Sie nach globalen Variablen.
Für traditionelle Klassen ist ihre Metaklasse „types.ClassType“.
Metaklassen verfügen außerdem über einen Konstruktor, der drei Parameter übergibt: den Klassennamen, ein von der Basisklasse geerbtes Datentupel und ein Wörterbuch mit Klassenattributen.
Als nächstes definieren wir eine Metaklasse, die erfordert, dass beim Schreiben einer Klasse eine __str__()-Methode für die Klasse bereitgestellt werden muss. Wenn die __repr__()-Methode nicht bereitgestellt wird, gibt
eine Warnung aus.
from warnings import warn #元类需要继承type类 class ReqStrSugRepr(type): def __init__(cls, name, bases, attrd): #构造函数需要传递的参数为类名,基类,类属性字典 super(ReqStrSugRepr, cls).__init__(name, bases, attrd) # 判断__str__字符串是否在类的属性字典里 if '__str__' not in attrd: raise TypeError('Class requires overriding of __str__()') if '__repr__' not in attrd: warn('Class suggests overriding of __repr__()\n', stacklevel=3) class Foo(object): #给类指定元类 __metaclass__ = ReqStrSugRepr def foo(self): pass #这一段代码不用创建类来测试,直接运行一下就会报错,可见元类的功力。
Typ
# <type 'int'> # <type 'str'> type(1) type('mink')
Typ akzeptiert drei Parameter: Name, Basen, Diktat. Der erste Parameter akzeptiert den Klassennamen, der zweite Parameter akzeptiert die übergeordnete Klasse (Tupelform) und der dritte Parameter akzeptiert Attribute und Methoden (Wörterbuchform)
X = type('X', (object,), dict(a=1)) # 等于 class X(object): a = 1
def say(self): print 'hello' X = type('X', (object,), dict(say=say)) x = X() # pirnt hello x.say()
Metaklasse
Wir alle wissen, dass Instanzobjekte über Klassen erstellt werden können und Metaklassen Klassen sind, die Klassenobjekte erstellen. Typ kann Klassenobjekte erstellen, was bedeutet, dass Typ eine Metaklasse ist.Metaclass-Attribut
Wenn Sie Metaclass zum Erstellen eines Klassenobjekts verwenden möchten, müssen Sie dem Objekt ein __metaclass__-Attribut hinzufügen. Natürlich müssen Sie zuerst eine Metaklasseclass PrivateMetaclass(type): def __new__(cls, name, parents, attrs): attrs = dict(('__%s' % k, v) for k, v in attrs.itmes()) return super(PrivateMetaclass, cls).__new__(cls, name, parents, attrs) class A(object): __metaclass__ = PrivateMetaclass a = 1 b = 2 a = A() # raise AttributeError print a.a, a.b # print 1, 2 print a.__a, a.__b