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。
