在以下语句中定义类行为:
my_object[item] = ...
我知道我需要定义
__setitem__
方法。
我需要为以下语句定义什么方法:
my_object[item] += ...
my_object
需要__getitem__
来检索my_object[item]
的初始值并需要__setitem__
来设置新值。
此外,Python 需要一种方法来执行加法。要么
my_object[item]
需要用__add__
或__iadd__
实现加法,或者+=
右侧的对象需要实现__radd__
。
__setitem__
将涵盖您的容器类别;当您执行任何增强作业时,就像常规作业一样,它会被调用。据您的班级所知,x[i] += 1
和 x[i] = x[i] + 1
之间没有区别。
如果您需要将
+=
与 =
或 -=
区别对待,则可以通过 item 的 类的特殊方法来处理。
要添加到其他答案,使用
dis.dis
查看相应代码的字节码总是有帮助的。例如:
import dis
def f(x):
x[2] += 3
print(dis.dis(f))
你得到:
2 0 LOAD_FAST 0 (x)
2 LOAD_CONST 1 (2)
4 DUP_TOP_TWO
6 BINARY_SUBSCR
8 LOAD_CONST 2 (3)
10 INPLACE_ADD
12 ROT_THREE
14 STORE_SUBSCR
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
BINARY_SUBSCR
实现:
key = STACK.pop()
container = STACK.pop()
STACK.append(container[key])
所以,这意味着,这段 Python 代码基本上是这样做的:
# DUP_TOP_TWO will store the container and key on the hash,
# so that it is reused for both BINARY_SUBSCR
# and the later STORE_SUBSCR.
key = 2
value = 3
item_value = x[key] # BINARY_SUBSCR
item_value += value # INPLACE_ADD
x[key] = item_value # STORE_SUBSCR