Is it possible to override __getitem__ at instance level in Python?
This is unfortunately, and quite surprisingly, not allowed:
For custom classes, implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type, not in the object’s instance dictionary.
Don't do it...
The item lookup protocol will always recover
__getitem__ from the class, it will not even look at instance
__dict__. This is actually a good thing in general as doing otherwise would allow instances of the same class to be conceptually different from one another, which goes against the whole idea behind classes.
Nonetheless, there are situation where this could potentially be helpful, by example when monkey-patching for test purpose.
Because the dunder is looked up directly at class level, the item lookup logic must also be updated at the class level.
A solution is thus to update
__getitem__ so that it first looks for an instance-level function in the instance
Here is an example where we are subclassing
dict to allow for instance-level
class Foo(dict): def __getitem__(self, item): if "instance_getitem" in self.__dict__: return self.instance_getitem(self, item) else: return super().__getitem__(item) foo = Foo() foo.instance_getitem = lambda self, item: item + 1 print(foo) # 2