В Python объект подписывается, когда его класс определяет метод
__getitem__(self, k)
, что позволяет нам "получать элементы" с помощью синтаксиса скобок:
obj[k]
Синтаксис длявстроенная функция del:
del(obj[k])
Это удаляет элемент k из (подписного) объекта obj.Но, по-видимому, без вызова специального метода 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!
Таким образом, кажется, что перед тем как [2] перенаправить работу в метод getitem, интерпретатор знаетконтекст del и обходит его, вызывая вместо него
a.__delitem__(2)
.
Как это работает?
И, самое главное: настраивается ли этот механизм?
Могу ли я, например, написать функцию foo, чтобы
foo(obj[k])
никогда не вызывал
obj.__getitem__(k)
, а вместо этого, например,
obj.foo(k)