在 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.copy
和 copy.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
我正在编写一个程序,该程序涉及递归地创建一个可以作为参数传递的对象的实例。程序示例:
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.copy
和 copy.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