最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Django中的元类

来源:动视网 责编:小采 时间:2020-11-27 14:28:45
文档

Django中的元类

Django中的元类:看Django(1.6)的Form相关源代码时比较迷惑,于是节选了django.forms.forms.py中的几个代码片段来分析Django中是怎么使用元类的:def with_metaclass(meta, *bases): Create a base class with a metaclass.
推荐度:
导读Django中的元类:看Django(1.6)的Form相关源代码时比较迷惑,于是节选了django.forms.forms.py中的几个代码片段来分析Django中是怎么使用元类的:def with_metaclass(meta, *bases): Create a base class with a metaclass.


看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
' % (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: , 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。

文档

Django中的元类

Django中的元类:看Django(1.6)的Form相关源代码时比较迷惑,于是节选了django.forms.forms.py中的几个代码片段来分析Django中是怎么使用元类的:def with_metaclass(meta, *bases): Create a base class with a metaclass.
推荐度:
标签: 中的 Django 元类
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top