gpt4 book ai didi

python - __iadd__ 应该返回一个新对象还是操作 self?

转载 作者:行者123 更新时间:2023-12-01 06:28:06 25 4
gpt4 key购买 nike

我对 python (一般来说是 oop) 很陌生,我想知道对 __iadd__ 的期望是什么。是。它应该创建一个新对象还是修改现有对象?

因此,如果我考虑一类分数并使用 += 添加两个分数:

q1 = Fract(1, 2) #q1 = 1/2
q2 = Fract(2, 3) #q2 = 2/3
id1 = id(q1)
q1 += q2 #q1 = 5/6
id2 = id(q2)

现在是期望id1 == id2 ?这只是一个风格问题还是在现实世界的应用程序中造成了这种差异?

我在 complex 中的构建中尝试过此操作class 并在那里创建了一个新对象。

最佳答案

如果你想要一个可变对象,你应该操作 self 返回 self (不是新对象)。如果您定义 __iadd__类似的东西

def __iadd__(self, other):
self.n += ...
self.d += ...

该函数将返回None ,这就是分配给名称 q1 的内容。如果您有对该对象的另一个引用,您将看到它已就地更新,但是q1不再提及。

为了构建一个小示例,让我们看一下 Fract.__imul__不会返回self (因为实现比 __iadd__ 更简单):

class Fract:
def __init__(self, x, y):
self.n = x
self.d = y

def __imul__(self, other):
self.n *= other.n
self.d *= other.d

x1 = Fract(1,2)
x2 = x1

y = Fract(1,2)

x1 *= y

运行此代码后,您将看到 x1现在绑定(bind)到 None ,但是x2仍然绑定(bind)到 Fract 的原始实例,现在有 x2.d == 4正如预期的那样。

因此,即使您想就地更新左侧操作数,__iadd__等人。仍需返回self为了保持名称引用相同的值。

如果你想要Fract不可变(例如 intcomplex ),请返回一个新对象。

def __imul__(self, other):
return Fract(self.n*other.n, self.d*other.d)

关于python - __iadd__ 应该返回一个新对象还是操作 self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029429/

25 4 0
文章推荐: Java 线程安全计数器
文章推荐: Python列表理解: How do I manipulate text from a file
文章推荐: java - 通过可比较接口(interface)对 ArrayList 进行排序