У меня возникли проблемы с пониманием того, почему происходит следующее. У меня есть декоратор, который ничего не делает, кроме того, что он проверяет, является ли функция методом. Я думал, что понял, что такое метод на Python, но, очевидно, это не так:
import inspect
def deco(f):
def g(*args):
print inspect.ismethod(f)
return f(*args)
return g
class Adder:
@deco
def __call__(self, a):
return a + 1
class Adder2:
def __call__(self, a):
return a + 2
Adder2.__call__ = deco(Adder2.__call__)
Теперь выполните следующие действия:
>>> a = Adder()
>>> a(1)
False
2
>>> a2 = Adder2()
>>> a2(1)
True
3
Я ожидал бы, что этот код будет печатать True два раза.
Итак, украшение функции вручную, как в Adder2, не является точным эквивалентом декорирования с помощью функции @deco?
Кто-нибудь может быть так рад и объяснить, почему это происходит?