将(OOP)对象分配给另一个

时间:2017-11-21 19:36:07

标签: python python-3.x oop

我试图使用下面的replace_object()之类的成员函数将Python对象分配给另一个就地。但是,如您所见,object_A保持不变,复制object_B的唯一方法是创建一个全新的对象object_C,这违背了就地分配的目的。

这里发生了什么,我如何就地进行任务?

class some_class():

    def __init__(self, attribute):

        self.attribute = attribute

    def replace_object(self, new_object):

        self = new_object

        # Does this line even have any effect?
        self.attribute = new_object.attribute 

        self.new_attribute = 'triangle'

        return self

object_A = some_class('yellow')
print(object_A.attribute)       # yellow
object_B = some_class('green')
object_C = object_A.replace_object(object_B)
print(object_A.attribute)       # yellow
print(object_C.attribute)       # green

#print(object_A.new_attribute)  # AttributeError!
print(object_B.new_attribute)   # triangle
print(object_C.new_attribute)   # triangle

我还尝试使用copy.copy()来处理深层拷贝,但无济于事。

有趣的是,如果我更换

object_C = object_A.replace_object(object_B)

object_A = object_A.replace_object(object_B)
然后我得到了我想要的东西。但为什么self = new_object内的replace_object()语句可以实现相同的结果呢?

PS:我有充分的理由去做这个就地分配,所以虽然这可能不是一般的最佳做法,但请跟我一起去。

1 个答案:

答案 0 :(得分:1)

您无法将对象分配给另一个'。您可以将新对象和现有对象分配给新名称和现有名称。

self = new_object仅表示从现在起名称self将引用new_object',并且对旧对象不执行任何操作。 (注意self只是一个变量名,就像任何其他名称一样,只有通过约定才能引用类定义中的对象。)

后续命令self.attribute = new_object.attribute无效,因为self已成为new_object的重复标签。

您可以将新对象的所有属性复制到旧对象。最终会得到两个具有不同名称和相同属性的不同对象。除非overrode the equality operator用于这些对象,否则相等的测试(a == b)将返回false。

要内联复制所有属性,您可以执行this

之类的操作
def replace_object(self, new_object):
    self.__dict__ = new_object.__dict__.copy() # just a shallow copy of the attributes

有很多方法可以做任何你想做的事情。