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

Python 将(OOP)对象分配给另一个对象,python,python-3.x,oop,Python,Python 3.x,Oop,我试图使用一个成员函数(如下面的replace\u object())将一个Python对象分配给另一个本地对象。但是,如您所见,object_A保持不变,复制object_B的唯一方法是创建一个全新的对象object_C,这与就地分配的目的背道而驰 这里发生了什么?我如何安排作业 class some_class(): def __init__(self, attribute): self.attribute = attribute def replace

我试图使用一个成员函数(如下面的
replace\u 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)

然后我得到我想要的。但是为什么不能通过
replace\u object()
中的语句
self=new\u object
实现相同的结果呢


PS:我有一个很好的理由来做这个就地分配,所以尽管它通常不是最佳实践,但请跟我来。

你不能“将一个对象分配给另一个对象”。可以将新对象和现有对象指定给新名称和现有名称

self=new\u object
只说“从现在起,名称
self
将引用
new\u object
”,对旧对象不做任何操作。(注意,
self
与其他任何变量一样,只是一个变量名,仅按惯例指类定义中的对象。)

后续命令
self.attribute=new\u object.attribute
无效,因为
self
已成为
新对象的重复标签

可以将新对象的所有属性复制到旧对象。最终将得到两个具有不同名称和相同属性的不同对象。相等性测试(
A==b
)将返回false,除非您为这些对象指定了值

要内联复制所有属性,可以执行以下操作:


很可能有更好的方法来完成您想做的任何事情。

Python中的赋值不是这样工作的,尝试改变这些类型的语言机制即使对专家来说也不太可能成功。你能解释一下为什么你认为你需要这样做吗?@ScottHunter。。。因为明显的替代方案,即
object\u A=object\u A.replace\u object(object\u B)
,似乎是多余的。为什么不能复制所有属性来删除传入对象中的属性,或者不管你如何定义“相等”。正如我已经解释过的,这是因为你做了
self=new\u object
。不要这样做,因为现在这样做时:
self.attribute=new\u object.attribute
语句相当于
new\u object.attribute=new\u object.attribute
,即完全没有意义。那么,还有什么替代方法呢?
object\u A=object\u A.replace\u object(object\u B)
是不是既多余又不雅观?我对答案进行了编辑,并建议如何复制属性。但是,我发现很难看到这样一个场景:这是一个有用的方法。这可以做到,谢谢。但为什么它必须是一个肤浅的副本?为什么不干脆
self.\uuuuu dict\uuuuu=new\u object.\uuuu dict\uuuu
?如果这样做,那么旧对象的属性字典将始终指向新对象的属性字典(两个名称都指向同一个对象)。例如,如果您键入
new_object.x=30
,您将发现
old_object
现在也有一个属性
x
等于30。也许这就是你想要的?事实上,我只是选择循环遍历所有属性,并使用
\uu setattr\uuu()
。这是科赫还是我还在做错什么?
object_A = object_A.replace_object(object_B)
def replace_object(self, new_object):
    self.__dict__ = new_object.__dict__.copy() # just a shallow copy of the attributes