【问题标题】:Cloning an object in Python [duplicate]在Python中克隆一个对象[重复]
【发布时间】:2018-09-15 13:22:46
【问题描述】:

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

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”的所有变量分配给 self?我收到以下错误:

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) 似乎也可以工作。但我希望在课堂上而不是在程序的主体中完成复制。

【问题讨论】:

    标签: python python-3.x class oop cloning


    【解决方案1】:

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

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

    您可以通过定义 __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
    

    【讨论】:

    • 问题是我有很多属性必须作为参数(不可能)。我们是否总是必须覆盖 copydeepcopy 方法并手动分配所有对象参数?
    • 是的,虽然如果你有很多属性,你可以制作你的__init__来返回一个空对象,然后让__copy__self.__dict__填充它
    猜你喜欢
    • 2012-06-26
    • 2018-02-11
    • 2014-01-11
    • 2017-06-13
    • 2011-04-15
    • 2018-11-27
    • 1970-01-01
    • 2012-04-01
    • 2014-07-08
    相关资源
    最近更新 更多