Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 复制自定义对象时深度复制失败_Python_Python 2.7_Class_Class Method - Fatal编程技术网

Python 复制自定义对象时深度复制失败

Python 复制自定义对象时深度复制失败,python,python-2.7,class,class-method,Python,Python 2.7,Class,Class Method,我有一个类,它将字典转换成这样的对象 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

我有一个类,它将字典转换成这样的对象

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__'
但是,对于I overridegetattr函数,在
Dict2obj
类中,I能够执行深度复制操作。见下面的例子

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方法来执行此类返回的对象的深度复制问题发生在您的第一个类中,因为
copy.deepcopy
尝试调用
getattr(x,“\u deepcopy\u”,None)
。第三个参数的意义在于,如果对象的属性不存在,它将返回第三个参数

这是在-

getattr(对象,名称[,默认值])

返回对象的命名属性的值。名称必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x,'foobar')等同于x.foobar如果命名属性不存在,则返回默认值(如果提供),否则将引发AttributeError

如果基础
\uuuu getattr\uuuu
引发
AttributeError
,并且为
getattr()
函数调用提供了
default
参数,则
AttributeError
getattr()
函数捕获并返回默认参数,否则它会让
属性错误
冒泡。范例-

>>> class C:
...     def __getattr__(self,k):
...             raise AttributeError('asd')
...
>>>
>>> c = C()
>>> getattr(c,'a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __getattr__
AttributeError: asd
>>> print(getattr(c,'a',None))
None
class Dict2obj(dict):

    def __init__(self, d):
        self.update(**dict((k, self.parse(v))
                           for k, v in d.iteritems()))

    def __getattr__(self, name):
        try:
            return self[name]
        except KeyError:
            raise AttributeError(name)
    ...

如果我们不能更改对象类代码怎么办?有没有其他简单的方法可以简单地制作一个对象的副本,而不是与原始对象绑定?