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

1 投票
1 回答
852 浏览
提问于 2025-04-28 03:42

我对Python中的装饰器还不是很熟悉,正在尝试写一个简单的装饰器。这个装饰器的目的是检查我的类的状态(也就是说,当依赖的某个函数第一次被调用时,执行某个操作)。我的问题是,我想让装饰器函数也能知道self里的所有内容,并把实际的函数作为“参数”传递进去。

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 个回答

1

根据@aruisdante的建议,我成功地实现了一个正确的装饰器。

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

(这个装饰器是在我的类里面定义的)

撰写回答