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。
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did86981