Python:如何在装饰器内部方法中访问装饰器所属类的self?
解决类装饰器中访问父类变量的问题
首先修正原代码中的语法错误:类内部定义类属性时,不能直接使用self,self是实例方法中代表实例的参数,类属性应直接绑定在类上。
接下来针对你的需求,分两种场景给出解决方案:
场景1:访问类A的类属性
如果someVarInsideClassA是类A的类属性,你可以直接在装饰器中通过A.someVarInsideClassA访问——类属性属于类本身,和具体实例无关。修正后的代码如下:
class A: # 正确定义类属性,无需self someVarInsideClassA = "hello some variable inside class A" def Decorators(func): def inner(self): print("Decoration started.") # 直接通过类名访问类属性 print(A.someVarInsideClassA) func(self) print("Decoration of function completed.\n") return inner @Decorators def fun1(self): print("Decorating - Class A methods.") class B(A): @A.Decorators def fun2(self): print("Decoration - Class B methods.") obj = B() obj.fun1() obj.fun2()
场景2:访问类A的实例属性
如果someVarInsideClassA是实例属性(每个实例拥有独立副本),需在类A的__init__方法中定义。由于B继承了A,B的实例也会继承该属性,装饰器中的self可以直接访问:
class A: def __init__(self): self.someVarInsideClassA = "hello some variable inside class A" def Decorators(func): def inner(self): print("Decoration started.") # self是B的实例,但继承了A的实例属性,可直接访问 print(self.someVarInsideClassA) func(self) print("Decoration of function completed.\n") return inner @Decorators def fun1(self): print("Decorating - Class A methods.") class B(A): @A.Decorators def fun2(self): print("Decoration - Class B methods.") obj = B() obj.fun1() obj.fun2()
额外优化:装饰器的规范写法
你当前的Decorators是类A中的普通函数,更规范的做法是将其定义为静态方法,避免潜在的绑定问题:
class A: someVarInsideClassA = "hello some variable inside class A" @staticmethod def Decorators(func): def inner(self): print("Decoration started.") print(A.someVarInsideClassA) func(self) print("Decoration of function completed.\n") return inner # 后续代码与之前一致...
内容的提问来源于stack exchange,提问作者scorpion35
相关产品推荐
相关产品推荐

