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