import types
class customizable:
def __init__(self, method):
self.method = method
def __set_name__(self, owner, name):
self.name = name
def __get__(self, obj, obj_type=None):
if obj:
try:
return vars(obj)[self.name]
except KeyError:
return self.method.__get__(obj, obj_type)
return self.method
class Foo():
@customizable
def __getitem__(self, x):
return x
def new_get(self, x):
return x + 1
x = Foo()
y = Foo()
x.__getitem__ = types.MethodType(new_get, x)
print(Foo.__getitem__)
print(x[42])
print(y[42])
aW1wb3J0IHR5cGVzCgpjbGFzcyBjdXN0b21pemFibGU6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kKToKICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAoKICAgIGRlZiBfX3NldF9uYW1lX18oc2VsZiwgb3duZXIsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIG9ial90eXBlPU5vbmUpOgogICAgICAgIGlmIG9iajoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHZhcnMob2JqKVtzZWxmLm5hbWVdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm1ldGhvZC5fX2dldF9fKG9iaiwgb2JqX3R5cGUpCiAgICAgICAgcmV0dXJuIHNlbGYubWV0aG9kCgpjbGFzcyBGb28oKToKICAgIEBjdXN0b21pemFibGUKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCB4KToKICAgICAgICByZXR1cm4geAoKZGVmIG5ld19nZXQoc2VsZiwgeCk6CiAgICByZXR1cm4geCArIDEKCnggPSBGb28oKQp5ID0gRm9vKCkKeC5fX2dldGl0ZW1fXyA9IHR5cGVzLk1ldGhvZFR5cGUobmV3X2dldCwgeCkKcHJpbnQoRm9vLl9fZ2V0aXRlbV9fKQpwcmludCh4WzQyXSkKcHJpbnQoeVs0Ml0p