Можно ли динамически назначать специальные методы, такие как __getitem__
, экземпляру класса с использованием setattr()
? Например, если у меня есть это:Настройка специальных методов с помощью 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
Там, очевидно, что-то происходит здесь t Я не понимаю, как Python выполняет поиск методов для такого рода вещей. Должны ли эти методы устанавливаться в классе , а не на экземпляре?
UPDATE:
Итак, я должен сделать это ясно, чем я знаю, что могу увидеть это на Example
классе ... Я надеялся, что есть способ, чтобы установить их в-например, но Консенсус, который я вижу до сих пор, заключается в том, что вы не можете этого сделать.
Хм ... но это повлияло бы на все экземпляры «Пример», а не только на конкретный экземпляр. Вернемся к чертежной доске для меня, я думаю. – larsks
@larsks Это довольно тривиально, чтобы '__getitem __()' вызывать функцию в экземпляре. Я добавлю пример. –