来源
from copy import deepcopy
class Field(object):
def __init__(self):
self.errors = []
class BaseForm(object):
pass
class MetaForm(type):
def __new__(cls, name, bases, attrs):
attrs['fields'] = dict([(name, deepcopy(attrs.pop(name))) for name, obj in attrs.items() if isinstance(obj, Field)])
return type.__new__(cls, name, bases, attrs)
class Form(BaseForm):
__metaclass__ = MetaForm
class MyForm(Form):
field1 = Field()
f1 = MyForm()
f1.fields['field1'].errors += ['error msg']
f2 = MyForm()
print f2.fields['field1'].errors
输出
['error msg']
问题
为什么会输出这个?我以为在修改之前已经克隆了错误列表,并且它们不应该引用同一个列表?
MetaForm.__new__
只被MyForm
(以及Form
)调用了 一次,尽管我构造了 两个MyForms
。这是怎么工作的?我的理解是每次构造时都需要调用它。我猜它在类级别上运行?那么最好把deepcopy
语句放在哪里呢? - mpen