有关类方法装饰器的一些问题
我有一段代码,想在一个 classmethod
上使用一个装饰器,代码如下:
import functools
def mydeco(function):
@classmethod
def wrapper(cls):
return function(cls)
return functools.update_wrapper(wrapper, function)
# return wrapper
class BaseClass(object):
@classmethod
@mydeco
def foo(cls):
return "42"
print BaseClass.foo()
当我把 @mydeco
这一行注释掉时,代码就能正常运行,也就是说,文本 42
会被打印出来。但是一旦加上这个装饰器,我就遇到了几个问题:
当我使用简单的
return wrapper
这一行时,我收到了一个错误提示:TypeError: 'classmethod' object is not callable
我想知道怎么才能正确地做到这一点,也就是说,在这个例子中,原始的函数能够不被改变地返回。
当我使用更复杂的调用
return functools.update_wrapper(wrapper, function)
来保留一些原始函数的属性时,我又收到了一个错误提示:AttributeError: 'classmethod' object has no attribute '__module__'
我不确定这个错误是否和第一个问题有关,但我觉得它看起来是个不同的问题。欢迎任何具体的建议来解决这些问题。
上面的例子其实并没有真正“做”什么,它只是一个最简单的例子,用来展示我遇到的问题。
4 个回答
-2
可能问题出在 @classmethod
这个标记上,因为 def wrapper...
是一个函数的定义,而不是一个类的定义。
2
你有没有什么原因觉得这个方法不适合你呢?
import functools
def mydeco(function):
def wrapper(*args, **kwargs):
return function(*args, **kwargs)
return functools.update_wrapper(wrapper, function)
class BaseClass(object):
@classmethod
@mydeco
def foo(cls):
return "42"
print BaseClass.foo()
42