您希望覆蓋的每個實例的基礎屬性查找算法的方法的包裝?不知道你爲什麼試圖這樣做,我會冒險猜測,有一種更乾淨,更簡單的方式來做你需要做的事情。如果你真的需要那麼就像Aaron說的那樣,你需要在類上安裝一個重定向處理器,因爲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
另外,如果你要重寫你的實例方法,你不必實例化的Method對象自己,你可以要麼在生成方法的函數上使用描述符協議,要麼只是咖喱自我參數。
#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)
'__getattribute __()'即使在具有這樣的名稱的屬性時也被調用。你說的對'__getattr __()'方法是真實的。 – 2009-10-13 19:57:03
-1 to Python for'__getattr__','__getattribute__'和'__setattr__'造成的混淆 – 2009-10-13 20:31:03
你是對的;我已經刪除了我的破壞的實現。螞蟻的解決方案是正確的。 – 2009-10-14 07:36:54