Ich war verwirrt, als ich mir den formularbezogenen Quellcode von Django (1.6) ansah, also habe ich mehrere Codeausschnitte aus django.forms.forms.py extrahiert, um zu analysieren, wie Metaklassen in Django verwendet werden:
def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" return meta("NewBase", bases, {}) class DeclarativeFieldsMetaclass(type): def __new__(cls, name, bases, attrs): print('cls: %s, name: %s, bases: %s ,attrs: %s\n' % (cls, name, bases, attrs)) new_class = super(DeclarativeFieldsMetaclass, cls).__new__(cls, name, bases, attrs) # new_class._meta = '123' return new_class class BaseForm(object): pass class Form(with_metaclass(DeclarativeFieldsMetaclass, BaseForm)): pass class MyForm(Form): a = 1 b = 2
Laden Sie das obige Python-Modul. Die Konsole gibt Folgendes aus:
cls:
cls:
cls:
Obwohl die Metaklasse im Code nicht direkt für MyForm angegeben ist, ist DeclarativeFieldsMetaclass tatsächlich die Metaklasse von MyForm, da MyForm von Form und Form von der von DeclarativeFieldsMetaclass generierten Klasse „NewBase“ erbt.