0

在下面的代码中,我使用装饰器对类变量执行更改

class MyClass():

    def __init__(self):
        self.vars = [1,2]
        self.log = None

    def _mydecorator(function):
        def logger(self):
            self.log = "BLA"
            function(self)
        return logger

    @_mydecorator
    def addone(self):
        print("Inside Class: %s" % map(lambda x: x+1, self.vars))
        return map(lambda x: x+1, self.vars)


if __name__ == '__main__':
    myclass = MyClass()
    print myclass.addone()

此脚本返回:

Inside Class: [2,3]
None

为什么值没有传递给调用者?

如果我不装饰addone我得到的功能:

Inside Class: [2,3]
[2,3]

这个装饰器有什么变化?

4

2 回答 2

7

您需要更改装饰器以返回调用未装饰方法的结果:

def _mydecorator(function):
    def logger(self):
        self.log = "BLA"
        return function(self)
    return logger
于 2013-10-12T23:08:52.940 回答
5

您的logger函数不返回函数调用的结果。改变:

function(self)

至:

return function(self)
于 2013-10-12T23:08:37.013 回答