Heim >Backend-Entwicklung >Python-Tutorial >Metaklassen in Django

Metaklassen in Django

高洛峰
高洛峰Original
2016-10-17 14:03:101521Durchsuche

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: , Name: NewBase, Basen: (,) , attrs: {}

cls: , name: Form, basen: (,), attrs: {'__module__': '__main__'}

cls: , Name: MyForm, Basen: (,), Attrs: {'a': 1, '__module__': '__main__', 'b': 2}

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.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn