在 Python 中克隆一个对象

Cloning an object in Python

我正在编写一个程序,该程序涉及递归地创建一个可以作为参数传递的对象的实例。程序示例:

from copy import copy
class test():
    def __init__(self, sample=None):
        if not sample:
            self.a = int(input())
            self.b = int(input())
        else:
            self = copy(sample)

# MAIN HERE..
sampleobj1 = test()
print (sampleobj1.a, sampleobj1.b)
sampleobj2 = test(sampleobj1)
print (sampleobj2.a, sampleobj2.b)

如何克隆一个对象(此处为 sampleobj1)而不是手动将 "sample" 的所有变量分配给自己?我收到以下错误:

Traceback (most recent call last):
File "test.py", line 17, in <module>
print (sampleobj2.a, sampleobj2.b)
AttributeError: 'test' object has no attribute 'a'

为什么行:self = sample 行不通?无论我做什么,我总是碰巧遇到同样的错误。单独复制属性似乎很好。但是我正在编写具有很多属性的代码,其中复制每个属性似乎有点冗长。

sampleobj3 = copy(sampleobj1) 似乎也有效。但我希望复制在 class 而不是在程序的主体中完成。

self = sample只覆盖一个局部变量,它不会替换最初存储在self中的对象。

要复制 class 的实例,您必须完全定义如何从现有对象构建新对象。

您可以通过定义 __copy____deepcopy__ 方法来做到这一点。这些是 copy.copycopy.deepcopy 分别使用的 dunder 方法。

不过请注意,在您的 __init__ 中使用 input 是不好的做法,因为它会妨碍上述解决方案。您应该将逻辑和 IO 分开。

import copy

class test():
    def __init__(self, a, b):
        self.a, self.b = a, b

    def __copy__(self):
        return type(self)(self.a, self.b)

# Here we encapsulate the IO part of your code
 def test_factory():
    a = int(input())
    b = int(input())
    return test(a, b)

foo = test_factory()
... # input the attributes
bar = copy.copy(foo) # a copy of your object