classmethods的装饰器的一些问题

Ale*_*lex 5 python decorator class-method python-2.7

我有一段代码,我想在其中使用装饰器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()
Run Code Online (Sandbox Code Playgroud)

当我注释掉@mydeco代码行时,即42打印文本。当包含这个装饰器时,我有几个问题:

如何正确地做到这一点,即,在给定的示例中,原始函数被返回而不被更改。

  • 当使用更复杂的调用return functools.update_wrapper(wrapper, function)来保留一些原始函数时,我得到了错误

    AttributeError: 'classmethod' object has no attribute '__module__'
    
    Run Code Online (Sandbox Code Playgroud)

我不确定这个错误是否与第一个问题有关,但对我来说它看起来是一个不同的问题。欢迎任何解决这些问题的具体建议。

上面的例子并没有真正“做”某事,它只是展示我遇到的问题的最小可能的例子。

cmd*_*cmd 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
Run Code Online (Sandbox Code Playgroud)