我有一个基础班和一个子班。 Base class
有一个类变量,该变量被传递给装饰器。现在,当我将Base继承为child并更改变量值时,装饰器不会采用over-ride
类变量值。
这是代码:-
class Base():
variable = None
@decorator(variable=variable)
def function(self):
pass
class Child(Base):
variable = 1
没有再次重写该函数:如何将子类变量传递给装饰器?
答案 0 :(得分:0)
deceze的评论已经解释了为什么在子类上没有体现出来。
一种解决方法是,您可以在装饰器端构建逻辑。
就是这样。
def decorator(_func=None, *, variable):
def decorator_func(func):
def wrapper(self, *args, **kwargs):
variable_value = getattr(self.__class__, variable)
print(variable_value)
# You can use this value to do rest of the work.
return func(self, *args, **kwargs)
return wrapper
if _func is None:
return decorator_func
else:
return decorator_func(_func)
还将装饰器语法从@decorator(variable=variable)
更新为@decorator(variable='variable')
class Base:
variable = None
@decorator(variable='variable')
def function(self):
pass
演示
b = Base()
b.function() # This will print `None`.
让我们尝试使用子类
b = Child()
b.function() # This will print `1`.