Установка специальных методов с помощью setattr()

Возможно ли динамически назначать специальные методы, такие как __getitem__экземпляру класса используя setattr()? Например, если у меня есть это:

class Example (object):
    pass

А затем попробуйте это:

>>> example = Example()
>>> setattr(example, '__getitem__', lambda x: 1)

Я получаю это:

>>> example['something']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Example' object has no attribute '__getitem__'

Но, конечно, это прекрасно работает:

>>> example.__getitem__('something')
1

Здесь явно происходит что-то, чего я не понимаю относительно как Python выполняет поиск методов для такого рода вещей. Нужно ли устанавливать эти методы в class, а не в экземпляре?

ОБНОВЛЕНИЕ:

Итак, я должен пояснить, что я знаю, что могу видеть это в классе Example... Я надеялся, что есть способ установить их per-instance, но консенсус, который я вижу до сих пор, заключается в том, что вы не можете этого сделать.

6
задан larsks 7 May 2012 в 14:57
поделиться