在Python中手动克隆/复制实例

时间:2011-06-20 17:10:13

标签: python copy clone

我知道模块copy中有deepcopycopy,但我想手动执行...

我开始玩__dict__对象只是为了看看如何创建设置与要复制的对象相同的属性的实例,这是我第一次测试的结果:

class A(object):
    def F(self):
        print "Test!"

a = A()
x = type('A', (object, ), dict(A.__dict__))
x.F()

执行时,出现以下错误:

  

TypeError:必须使用A实例作为第一个参数调用未绑定方法F()(没有任何内容)

我如何在Python中实现方法/函数来克隆/复制(递归)对象?

2 个答案:

答案 0 :(得分:9)

要手动创建用户定义的类A的实例的浅表副本,您可以

a = A()
b = object.__new__(A)
b.__dict__ = a.__dict__.copy()   # or dict(a.__dict__)

object.__new__()的调用会在不调用__init__()的情况下创建新实例。

您的代码构造了一个新的类型对象,而不是A的新实例。

实现深层复制更加复杂 - 您基本上需要重新实现整个copycopyreg模块。它们是用Python编写的 - 只需按照链接查看源代码即可。

答案 1 :(得分:0)

如果不回答“克隆/复制”问题,您的代码就会出现一个小错误。我的代码版本是:

class A(object):
    def f(self):
        print "Test!"

a = A()
a.f()

X = type('A', (object, ), dict(A.__dict__))
x = X()
x.f()