覆盖函数装饰器参数

时间:2018-11-01 06:47:59

标签: python

我有一个基础班和一个子班。 Base class有一个类变量,该变量被传递给装饰器。现在,当我将Base继承为child并更改变量值时,装饰器不会采用over-ride类变量值。

这是代码:-

class Base():   
    variable = None

    @decorator(variable=variable)
    def function(self):
        pass

class Child(Base):
    variable = 1

没有再次重写该函数:如何将子类变量传递给装饰器?

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`.