gpt4 book ai didi

python - 我可以通过交换 __dict__ 有效地交换两个类实例吗?

转载 作者:太空狗 更新时间:2023-10-29 17:06:25 25 4
gpt4 key购买 nike

我有一个有很多成员的大类,并且有很多对这个类实例的引用。不幸的是(出于合理的原因)所有这些引用都是错误的。

我没有在每次访问此类时重新创建每个对象(并在引用对象的任何地方查找和更新),也没有添加额外的间接级别,也没有单独交换成员,而是定义了一个方法:

def swap(self, other):
assert(isinstance(other, self.__class__))
self.__dict__, other.__dict__ = other.__dict__, self.__dict__

所以我可以这样做:

instance_a.swap(instance_b)
# now all references to instance_a everywhere are as if instance_a is instance_b

问题:它似乎工作正常(我不使用 __slots__),但感觉可能有我不应该这样做的原因,是吗?


这是我的实际用例:

我有一个以(必然)昂贵的方式实现比较运算符的类型。我有各种包含此类对象的排序数据结构。

当我对其中一个对象做某事时,我知道比较顺序已经改变,并且我的数据结构(所有这些!)中的顺序可以通过将修改后的对象与“下一个更大”的对象交换来恢复.

最佳答案

编辑

您正在做的事情是可行的,尽管它会让人们感到畏缩,因为它很骇人听闻。如果可能的话,我建议您考虑重写/重构您的比较运算符。到目前为止,这会给你最好的结果。当然,不知道所涉及的范围或时间范围,很难判断这是否立即可行,但相信我,如果你能“正确”地做事,从长远来看,你会花更少的时间重写。

原创

实际上,听起来您正在处理三个类——一个数据对象和两个实用程序类——但这是另一个问题。

这会中断,所以我要继续说,“不,你不能通过交换 __dict__s 来交换类”:

>>> class Foo:
... def __init__(self):
... self.__bar = 1
... def printBar(self):
... print self.__bar
...
>>> class Bar:
... def __init__(self):
... self.__bar=2
... def printBar(self):
... print self.__bar
...
>>> f=Foo()
>>> f.printBar() # works as expected
1
>>> f=Foo()
>>> b=Bar()
>>> f.__dict__, b.__dict__ = b.__dict__, f.__dict__
>>> f.printBar() # attempts to access private value from another class
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in printBar
AttributeError: Foo instance has no attribute '_Foo__bar'

关于python - 我可以通过交换 __dict__ 有效地交换两个类实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7255777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com