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