Использование исходного метода класса после оформления требует экземпляр объекта в качестве параметра
У меня есть следующий код: Декоратор:
def pyDecorator(func):
print func
@wraps(func)
def wrapped(*args, **kwargs):
print args
print kwargs
tBegin = time()
result = func(*args, **kwargs)
tEnd = time()
if result:
# UI update
print("nTBegin '{}'({} s)".format(func.__name__, tBegin))
# UI and report update
print("TEnd '{}' ({} s) ({} s) Result:{}".format(func.__name__, tEnd,tEnd - tBegin, result))
return result
#workarround to use the original function
wrapped._original=func
return wrapped
И оформленный метод класса:
class Dummy(object):
@pyDecorator
def ClassMethod(self):
print "Original class code executed"
return True
Если я вызываю метод для исходной функции следующим образом, я получаю эту ошибку "TypeError: ClassMethod() takes exactly 1 argument (0 given):"
ClassInstance.ClassMethod._original()
Поэтому я вынужден использовать следующий вызов:
ClassInstance.ClassMethod._original(ClassInstance)
Можно ли сделать это так же, как и в первом случае ? Я не понимаю, почему я должен помещать экземпляр класса в качестве параметра, когда он уже предоставлен.1 ответ:
Обратите внимание, что преобразование из функции в метод происходит, когда объект функции доступен через экземпляр класса, например, с помощью точечной ссылки. Однако здесь
ClassInstance.ClassMethod._original
является функцией, не привязанной ни к одному экземпляру класса._original
привязывается только к другому объекту функцииwrapper
(повышенному до связанного метода во время выполнения), а не к экземпляру класса. Поэтому неявный параметрself
не передается. Вам придется явно передать его.ClassInstance.ClassMethod._original ^ |- instance ^ |- method ^ |- function object bound to method
Я не понимаю, почему я следует поместить экземпляр класса в качестве параметра когда это уже предусмотрено
Нет, это еще не предусмотрено.