看Django(1.6)的Form有关源码时较为蒙蔽,因此选节了django.forms.forms.py中的好多个编码精彩片段来剖析Django中是怎么用元类的:
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
载入上边的Python控制模块,控制面板会导出:
cls: <class '._main__.DeclarativeFieldsMetaclass'>, name: NewBase, bases: (<class '._main__.BaseForm'>,), attrs: {}
cls: <class '._main__.DeclarativeFieldsMetaclass'>, name: Form, bases: (<class '._main__.NewBase'>,), attrs: {'._module__': '__main__'}
cls: <class '._main__.DeclarativeFieldsMetaclass'>, name: MyForm, bases: (<class '._main__.Form'>,), attrs: {'a': 1, '._module__': '__main__', 'b': 2}
尽管沒有立即在编码中为MyForm特定metaclass,但因为MyForm承继自Form,而Form继承自DeclarativeFieldsMetaclass转化成的类名叫"NewBase"的类,因此DeclarativeFieldsMetaclass事实上便是MyForm的metaclass。
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。