Django中的元类

kkkkk 2018年12月17日 23:12 python框架

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


文章评论(0)
  • avatar kkkkkk 2018年12月21日 11:31
    潭州python学院老师真棒!
    kkkkk
    2018年12月21日 11:16
    本文标题即是中心,针对现状提出观点,纵横捭阖而旗帜鲜明。将“互联网+慈善”的意义上升到一个民族的价值选择和中华民族传统精神传承延续的高度并深入入到人性内在需求的深度,见解深刻。联系国外情况进行辩证分析,阐述其完善需要假以时日,视野开阔。诸多引用体作者其丰厚学养。
    回复
  • avatar kkkkkk 2018年12月21日 11:31
    能向你学习吗?
    kkkkklxinde
    2018年12月21日 11:17
    立意较高,内蕴丰富,文风帅气。
    回复
  • avatar kkkkklxinde 2018年12月21日 11:17
    立意较高,内蕴丰富,文风帅气。
    回复
  • avatar kkkkk 2018年12月21日 11:16
    本文标题即是中心,针对现状提出观点,纵横捭阖而旗帜鲜明。将“互联网+慈善”的意义上升到一个民族的价值选择和中华民族传统精神传承延续的高度并深入入到人性内在需求的深度,见解深刻。联系国外情况进行辩证分析,阐述其完善需要假以时日,视野开阔。诸多引用体作者其丰厚学养。
    回复