为什么在复制自定义对象时,深拷贝会出现 "KeyError: '__deepcopy__'" 的错误?

13 浏览
0 Comments

为什么在复制自定义对象时,深拷贝会出现 "KeyError: '__deepcopy__'" 的错误?

我有一个类,可以将字典转换为对象,代码如下:

class Dict2obj(dict):
    __getattr__= dict.__getitem__
    def __init__(self, d):
        self.update(**dict((k, self.parse(v))
                           for k, v in d.iteritems()))
   @classmethod
   def parse(cls, v):
    if isinstance(v, dict):
        return cls(v)
    elif isinstance(v, list):
        return [cls.parse(i) for i in v]
    else:
        return v

当我尝试对该对象进行深拷贝时,出现了以下错误:

import copy
my_object  = Dict2obj(json_data)
copy_object = copy.deepcopy(my_object)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 172, in deepcopy
copier = getattr(x, "__deepcopy__", None)
KeyError: '__deepcopy__'

但是,如果我在Dict2obj类中重写__getattr__函数,我就能够执行深拷贝操作。请参考以下示例:

class Dict2obj(dict):
    __getattr__= dict.__getitem__
    def __init__(self, d):
        self.update(**dict((k, self.parse(v))
                           for k, v in d.iteritems()))
    def __getattr__(self, key):
        if key in self:
            return self[key]
        raise AttributeError
    @classmethod
    def parse(cls, v):
        if isinstance(v, dict):
            return cls(v)
        elif isinstance(v, list):
            return [cls.parse(i) for i in v]
        else:
            return v

为什么我需要重写__getattr__方法才能对该类返回的对象进行深拷贝?

0