我无法理解为什么会发生以下情况。我有一个装饰器,它除了检查函数是否是方法之外什么都不做。我以为我已经了解 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 函数进行装饰?
有人可以很高兴并解释为什么会发生这种情况吗?