使用装饰器时正在销毁列表

时间:2013-10-12 23:05:41

标签: python

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

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]

这个装饰者改变了什么?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

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

function(self)

要:

return function(self)