Вы хотите переопределить алгоритм поиска атрибута для каждого отдельного экземпляра? Не зная, почему вы пытаетесь это сделать, я рискнул бы предположить, что есть более чистый, менее замысловатый способ сделать то, что вам нужно. Если вам действительно нужно, то, как сказал Аарон, вам нужно установить на класс обработчик перенаправления __getattribute__
, поскольку Python ищет специальные методы только в классе, игнорируя все, что определено в экземпляре.
Вы также должны быть особенно осторожны, чтобы не попасть в бесконечную рекурсию:
class FunkyAttributeLookup(object):
def __getattribute__(self, key):
try:
# Lookup the per instance function via objects attribute lookup
# to avoid infinite recursion.
getter = object.__getattribute__(self, 'instance_getattribute')
return getter(key)
except AttributeError:
return object.__getattribute__(self, key)
f = FunkyAttributeLookup()
f.instance_getattribute = lambda attr: attr.upper()
print(f.foo) # FOO
Кроме того, если вы переопределяете методы в своем экземпляре, вам не нужно самим создавать экземпляр объекта метода, вы можете либо использовать протокол дескриптора для функций, которые генерируют методы, либо просто указать аргумент self.
#descriptor protocol
self.method_to_overwrite = my_method.__get__(self, type(self))
# or curry
from functools import partial
self.method_to_overwrite = partial(my_method, self)