Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将参数作为装饰器发送到类?_Python_Decorator_Python Decorators - Fatal编程技术网

Python 如何将参数作为装饰器发送到类?

Python 如何将参数作为装饰器发送到类?,python,decorator,python-decorators,Python,Decorator,Python Decorators,我有下面的演示脚本,其中有两个装饰器(嵌套)。一个是validNumber,它是一个函数返回包装器,用于测试传递给修饰函数的参数是否为正;另一个是addExtra,它是一个类,用于将前一个修饰器的输出加上一个 def validNumber(f): def wrapper(*args): for arg in list(args): if arg < 0: raise AttributeError('The n

我有下面的演示脚本,其中有两个装饰器(嵌套)。一个是
validNumber
,它是一个函数返回包装器,用于测试传递给修饰函数的参数是否为正;另一个是
addExtra
,它是一个类,用于将前一个修饰器的输出加上一个

def validNumber(f):
    def wrapper(*args):
        for arg in list(args):
            if arg < 0:
                raise AttributeError('The number can\'t be negative')
        return f(*args)
    return wrapper

class addExtra:
    def __init__(self, fun):
        self.fun = fun
    def __call__(self, *args):
        total = self.fun(*args)
        if total < 100:
            total += 1 # I want to make it dynamic.
        return total

@addExtra
@validNumber
def sumOfNumbers(*args):
    return sum(list(args))
更新 正如社区提出的另一个问题与类似的问题。我做以下几点

class addExtra:
    def __init__(self, extra):
        self.extra = extra

    def __call__(self, fun):
        @functools.wraps(fun)
        def decorated(*args, **kwargs):
            total = fun(*args)
            if total < 100:
                total += self.extra  # I want to make it dynamic.
            return total
        return decorated 
class addExtra:
定义初始值(自身、额外):
额外的
定义呼叫(自我,乐趣):
@functools.wrapps(有趣)
def装饰(*args,**kwargs):
总计=乐趣(*args)
如果总数<100:
total+=self.extra#我想让它充满活力。
返回总数
回报
得到

TypeError:调用()接受2个位置参数,但给出了4个


有人能在这里解释一下,而不是转到其他问题或答案吗?甚至我也想知道@functools.wrapps在这里的用法。

要能够将参数传递给decorator,您必须创建一个返回decorator的函数

def addExtra(编号):
def装饰器(*args,**kwargs):
def包装(乐趣):
总计=乐趣(*args,**kwargs)
如果总数<100:
总数+=个数
返回总数
返回包装器

问题是作为类接受decorator中的参数。它的编写方式不会改变任何东西。此外,如果你从方法返回一个类,我所发布的仍然适用。它返回修饰的函数对象而不是结果。即
class addExtra:
    def __init__(self, extra):
        self.extra = extra

    def __call__(self, fun):
        @functools.wraps(fun)
        def decorated(*args, **kwargs):
            total = fun(*args)
            if total < 100:
                total += self.extra  # I want to make it dynamic.
            return total
        return decorated