当前位置:Gxlcms > Python > Django中的元类

Django中的元类

时间:2021-07-01 10:21:17 帮助过:54人阅读

看Django(1.6)的Form相关源代码时比较迷惑,于是节选了django.forms.forms.py中的几个代码片段来分析Django中是怎么使用元类的:

  1. def with_metaclass(meta, *bases):
  2. """Create a base class with a metaclass."""
  3. return meta("NewBase", bases, {})
  4. class DeclarativeFieldsMetaclass(type):
  5. def __new__(cls, name, bases, attrs):
  6. print('cls: %s, name: %s, bases: %s ,attrs: %s\n' % (cls, name, bases, attrs))
  7. new_class = super(DeclarativeFieldsMetaclass, cls).__new__(cls, name, bases, attrs)
  8. # new_class._meta = '123'
  9. return new_class
  10. class BaseForm(object):
  11. pass
  12. class Form(with_metaclass(DeclarativeFieldsMetaclass, BaseForm)):
  13. pass
  14. class MyForm(Form):
  15. a = 1
  16. b = 2

加载上面的Python模块,控制台会输出:

cls: , name: NewBase, bases: (,), attrs: {}

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

cls: , name: MyForm, bases: (,), attrs: {'a': 1, '__module__': '__main__', 'b': 2}

虽然没有直接在代码中为MyForm指定metaclass,但由于MyForm继承自Form,而Form继承自DeclarativeFieldsMetaclass生成的类名为"NewBase"的类,所以DeclarativeFieldsMetaclass实际上就是MyForm的metaclass。

人气教程排行