我知道模块copy
中有deepcopy
和copy
,但我想手动执行...
我开始玩__dict__
对象只是为了看看如何创建设置与要复制的对象相同的属性的实例,这是我第一次测试的结果:
class A(object):
def F(self):
print "Test!"
a = A()
x = type('A', (object, ), dict(A.__dict__))
x.F()
执行时,出现以下错误:
TypeError:必须使用A实例作为第一个参数调用未绑定方法F()(没有任何内容)
我如何在Python中实现方法/函数来克隆/复制(递归)对象?
答案 0 :(得分:9)
要手动创建用户定义的类A
的实例的浅表副本,您可以
a = A()
b = object.__new__(A)
b.__dict__ = a.__dict__.copy() # or dict(a.__dict__)
对object.__new__()
的调用会在不调用__init__()
的情况下创建新实例。
您的代码构造了一个新的类型对象,而不是A
的新实例。
实现深层复制更加复杂 - 您基本上需要重新实现整个copy
和copyreg
模块。它们是用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()