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
为什么它会输出这个呢?我想我在修改错误列表之前克隆了它,它们不应该同时引用同一个列表?在
通过在
metaclass
中设置dict
fields
,您正在创建一个class属性。在您定义的
__new__
方法在类创建时只运行一次。在更新
您应该像您一样操作
__new__
中的attrs
,但将其命名为_fields
。然后创建一个__init__
方法,将deepcopy
执行到名为fields
的attribute
中。在更明确的解决方案:
只需将
deepcopy
移到BaseForm.__init__
中,实际上每次实例化一个MyForm
时,都会被调用。在相关问题 更多 >
编程相关推荐