+= python 中的 __setitem__ 运算符(添加方括号)

问题描述 投票:0回答:3

在以下语句中定义类行为:

my_object[item] = ...

我知道我需要定义

__setitem__
方法。

我需要为以下语句定义什么方法:

my_object[item] += ...
python python-2.7 operator-overloading
3个回答
4
投票

my_object
需要
__getitem__
来检索
my_object[item]
的初始值并需要
__setitem__
来设置新值。

此外,Python 需要一种方法来执行加法。要么

my_object[item]
需要用
__add__
__iadd__
实现加法,或者
+=
右侧的对象需要实现
__radd__


1
投票

__setitem__
将涵盖您的容器类别;当您执行任何增强作业时,就像常规作业一样,它会被调用。据您的班级所知,
x[i] += 1
x[i] = x[i] + 1
之间没有区别。

如果您需要将

+=
=
-=
区别对待,则可以通过 item 的 类的特殊方法来处理。


0
投票

要添加到其他答案,使用

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
© www.soinside.com 2019 - 2024. All rights reserved.