首页 > 后端开发 > Python教程 > Django中的元类

Django中的元类

高洛峰
发布: 2016-10-17 14:03:10
原创
1502 人浏览过

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


相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板