python:用于简单装饰器函数的类命名空间

时间:2014-10-17 15:40:23

标签: python decorator python-decorators

我对Python中的装饰器有些新意,并且正在使用一个简单的装饰器,它应该检查我的类的状态(当第一次实际调用其中一个dependending函数时执行一次操作)。我的问题是,我想让装饰器函数也知道self中的所有内容并将实际函数作为'argument'传递(?)

class myClass(object):
    __init__(self):
        self.__isFoo = False
        self.__baz = 0

    def doFoo(self):
        ...  
        self.__isFoo = True

    def fooInit(self,func):
        if not self.__isFoo:
            self.doFoo()
        return func

    @property
    @fooInit
    def getBaz(self):
        return self.__baz

然而,有了这个,我得到一个错误

myObj = myClass()
myObj.getBaz

~~> TypeError: fooInit() takes exactly 2 arguments (1 given)

我有点理解,因为它只是     self.fooinit(self.getBaz) 如果我正确理解装饰器,或者?

所以我现在有点迷失了,我怎么能以一种简单的方式定义装饰器,它还知道类名称空间中的其他对象?

1 个答案:

答案 0 :(得分:0)

根据@ aruisdante的建议,我设法让一位合适的装饰工作

def fooInit(func):
    def _wrapped(self,*args, **kwargs):
        if not self.__isFoo:
            self.fooInit()
            return func(self,*args, **kwargs)
    return _wrapped

(在我班上定义)