当包装器(@function_wrapper )被应用于@classmethod时,将会抛出如下异常:class Class(object):@function_wrapper@classmethoddef cmethod(cls):pass Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 3, in ClassFile "<stdin>", line 2, in wrapperFile ".../functools.py", line 33, in update_wrappersetattr(wrapper, attr, getattr(wrapped, attr))AttributeError: "classmethod" object has no attribute "__module__"因为@classmethod 在实现时,缺少functools.update_wrapper 需要的某些属性。这是functools.update_wrapper 在python2中的bug,3.2版本已被修复,参考http://bugs.python.org/issue3445。然而,在python3下执行,另一个问题出现了:class Class(object):@function_wrapper@classmethoddef cmethod(cls):pass >>> Class.cmethod() Traceback (most recent call last):File "classmethod.py", line 15, in <module>Class.cmethod()File "classmethod.py", line 6, in _wrapperreturn wrapped(*args, **kwargs)TypeError: "classmethod" object is not callable这是因为包装器认定被包装的函数(@classmethod )是可以直接被调用的,但事实并不一定是这样的。被包装的函数实际上可能是描述符(descriptor ),意味着为了使其可调用,该函数(描述符)必须被正确地绑定到某个实例上。关于描述符的定义,可以参考https://docs.python.org/2/howto/descriptor.html。