编程语言
首页 > 编程语言> > python – 深度复制问题?

python – 深度复制问题?

作者:互联网

资源

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']

为什么输出那个?我以为我在修改它之前克隆了错误列表,并且他们不应该同时引用相同的列表?

解决方法:

通过在元类中设置dict字段,您将创建一个类属性.

您定义的__new__方法仅运行一次 – 在类创建时.

更新

你应该像你一样操纵__new__中的attrs,但是把它命名为_fields.然后创建一个__init__方法,该方法对名为fields的属性执行深度复制.

标签:python,deep-copy
来源: https://codeday.me/bug/20190705/1384139.html