Использование исходного метода класса после оформления требует экземпляр объекта в качестве параметра


У меня есть следующий код: Декоратор:

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 2

1 ответ:

ClassInstance.ClassMethod._original является функцией, не привязанной ни к одному экземпляру класса.

Обратите внимание, что преобразование из функции в метод происходит, когда объект функции доступен через экземпляр класса, например, с помощью точечной ссылки. Однако здесь _original привязывается только к другому объекту функции wrapper (повышенному до связанного метода во время выполнения), а не к экземпляру класса. Поэтому неявный параметр self не передается. Вам придется явно передать его.
ClassInstance.ClassMethod._original
^
|- instance   ^           
              |- method
                          ^
                          |- function object bound to method

Я не понимаю, почему я следует поместить экземпляр класса в качестве параметра когда это уже предусмотрено

Нет, это еще не предусмотрено.