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

2 投票
2 回答
4374 浏览
提问于 2025-04-16 19:55

我知道在 copy 模块里有 copydeepcopy 这两个功能,但我想手动实现一下...

我开始尝试使用 __dict__ 这个对象,看看怎么能创建一个实例,并设置和要复制的对象一样的属性。以下是我第一次测试的结果:

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

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

当我执行时,出现了以下错误:

TypeError: unbound method F() must be called with A instance as first argument (got nothing instead)

我该如何在 Python 中实现一个方法/函数来递归地克隆/复制一个对象呢?

2 个回答

0

在不直接回答你关于“克隆/复制”的问题的情况下,我想说你的代码有个小错误。以下是我修改后的代码版本:

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

a = A()
a.f()

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

要手动创建一个用户自定义类 A 的浅拷贝,你可以这样做:

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

调用 object.__new__() 会创建一个新的实例,但不会调用 __init__() 方法。

你的代码实际上是在构造一个新的类型对象,而不是 A 的新实例。

实现深拷贝要复杂得多——你基本上需要重新实现整个 copycopyreg 模块。它们是用Python写的——只需点击链接查看源代码。

撰写回答