sj26的解決方案是一個很好的解決方案。另一種方法是,如果您想要設置一個可以用任何用戶提供的函數或另一個對象的方法重載的方法,那麼就構建一個自定義描述符。這個描述符可以用作裝飾器(類似於@classmethod或@staticmethod);它允許你存儲在一個實例的字典功能,並將它作爲一個方法:
import types
class overloadable(object):
def __init__(self, func):
self._default_func = func
self._name = func.__name__
def __get__(self, obj, type=None):
func = obj.__dict__.get(self._name, self._default_func)
return types.MethodType(func, obj, type)
def __set__(self, obj, value):
if hasattr(value, 'im_func'): value = value.im_func
obj.__dict__[self._name] = value
def __delete__(self, obj):
del obj.__dict__[self._name]
現在我們可以只裝飾的功能與「@overloadable」:
class SomeClass(object):
def doStuff(self, string):
print 'do stuff:', string
@overloadable
def overLoaded(self, arg):
print 'default behavior:', arg
而且這會只是做的時候,我們重載它對於給定的情況下正確的事情:
>>> sc = SomeClass()
>>> sc.overLoaded("test string") # Before customization
default behavior: test string
>>> sc.overLoaded = sc.doStuff # Customize
>>> sc.overLoaded("test string")
do stuff: test string
>>> del sc.overLoaded # Revert to default behavior
>>> sc.overLoaded("test string")
default behavior: test string
事實證明,'classmethod'在Python中的特定含義,所以我不認爲你的意思是類方法在您的標題。也許是重新組合,例如「用運行時綁定的函數替換方法」? –
完成:) 感謝您指出。 – richo