如何在装饰器函数中访问类变量

时间:2019-08-15 04:50:02

标签: python class oop python-decorators

是否可以创建一个没有参数的装饰器函数,该函数可以访问类变量。我发现了类似的问题,但它们总是引用实例变量,而不是类变量,并且通常仅在调用装饰方法时才访问变量。

我想在类定义时而不是实例化之后引用类变量。

想到了其他解决方案,例如创建Meta类,但我只想使用一个类和一个没有参数的装饰器。

我能够以以下方式实现所需的功能而无需使用装饰器,从而获得预期的结果。

class B:
    b=3
    resetFuns=[]

    def __init__(self,x):
        self.x=x
        self.y=x+self.b


    def foo(self):
        self.y=self.x+self.b

    resetFuns.append(foo)

    def reset(self):
        for f in self.resetFuns:
            f(self)

test=B(4)
print(test.y)
B.b=9
print(test.y)
test.reset()
print(test.y)

7
7
13

但是我想使用与此类似的装饰器。

class A:
    b=3
    resetFuns=[] ##class variable I want to access

    def __init__(self,x):
        self.x=x
        self.y=x+self.b

    def resetDecorator(func):
        resetFuns.append(func) ##can't reference resetFuns like this 
        return func

    @resetDecorator
    def foo(self):
        self.y=self.x+self.b

    def reset(self):
        for f in resetFuns:
            f(self)

1 个答案:

答案 0 :(得分:2)

类似的东西:

def resetDecoratorCreator(resetFuns):
    def resetDecorator(func):
        resetFuns.append(func)
        return func
    return resetDecorator

class B:
    b=3
    resetFuns=[]
    resetDecorator = resetDecoratorCreator(resetFuns)

    def __init__(self,x):
        self.x=x
        self.y=x+self.b

    @resetDecorator
    def foo(self):
        self.y=self.x+self.b

    def reset(self):
        for f in self.resetFuns:
            f(self)

将为您提供所需的东西。