在python中,当一个对象的类定义一个对象时,它是可下标的
__getitem__(self, k)
方法,允许我们通过括号语法“获取项目”:
obj[k]
内置 del 函数的语法是:
del(obj[k])
这会从(可下标的)对象 obj 中删除项目 k。但显然,没有调用特殊的 getitem 方法。
请参阅下面的示例
>>> class A:
... def __init__(self, d):
... self._d = d
...
... def __getitem__(self, k):
... print("Calling __getitem__")
... return self._d[k]
...
... def __delitem__(self, k):
... del(self._d[k])
...
>>>
>>> a = A({1: 'one', 2: 'two', 3: 'three'})
>>> a._d
{1: 'one', 2: 'two', 3: 'three'}
>>> a[2]
Calling __getitem__
'two'
>>> del(a[2])
>>> # Note there was no "Calling __getitem__" print!
所以似乎在 a[2] 将工作转发给 getitem 方法之前,解释器知道 del 上下文,并绕过它,直接调用
a.__delitem__(2)
反而。
这是如何运作的?
最重要的是:这种机制是可定制的吗?
例如,我可以编写一个函数 foo 以便
foo(obj[k])
从不打电话
obj.__getitem__(k)
但是,例如,
obj.foo(k)