Metaklassen in Django

高洛峰
Freigeben: 2016-10-17 14:03:10
Original
1479 Leute haben es durchsucht

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
Nach dem Login kopieren

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.


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage