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, так что я не думаю, что вы имеете в виду classmethod в заголовке. Возможно, повторная фраза, что-то вроде «Заменить метод с функцией, связанной во время выполнения»? –
Done :) Спасибо, что указали это. – richo