写在前面
在联系元类的时候产生了这个疑惑,在__new__
里面返回值为什么要用type.__new__()
而不是type()
,我尝试着替换成后者,代码会起到意想不到的结果,甚至是无限递归导致报错。于是我去查下,在SO上找到了答案。
class ModelMetaclass(type):
def __new__(cls, name, bases, attrs):
if name=='Model':
return type.__new__(cls, name, bases, attrs)
print('Found model: %s' % name)
mappings = dict()
for k, v in attrs.items():
if isinstance(v, Field):
print('Found mapping: %s ==> %s' % (k, v))
mappings[k] = v
for k in mappings.keys():
attrs.pop(k)
attrs['__mappings__'] = mappings # 保存属性和列的映射关系
attrs['__table__'] = name # 假设表名和类名一致
return type.__new__(cls, name, bases, attrs)