装饰器中星号*问题
书上只是说星号可以解包。但程序给的参数还是一个。我也不清楚具体怎么用。有没有大神写一个多参数的装饰器,让我看看星号的用法到底是怎么用的,以及星号所展示的效果是什么样的。下面是我根据书上,照书话葫芦写的代码(但我看不出这个星号*的用处到底体现在哪里)
def log(func):
def wrapper(*name):
print("开始执行")
s = func(*name)
# print("func=",s)
print("结束执行")
return s
return wrapper
@log
def eat(name):
print("%s正在执行程序"%name)
return "%s正在执行程序"%name
x = eat("小甲鱼")
print("func=", x) 本帖最后由 Twilight6 于 2020-7-30 09:52 编辑
这个并不是装饰器特有的哈,只要在定义函数的时候,定义 * 参数名 这个就代表这个参数可以传入不定数量的参数
并将各个参数以元组形式储存在 参数名 中,比如你这里的 *name ,传入的参数最终都在 name 元组中的元素
当在函数内直接*name 就是解包,就是将 name 里面的元素全部取出
看个例子:name = (1,2,3,'abc',5,6)
print(*name)输出结果:1 2 3 'abc' 5 6 输出了这 6 个参数
def func(*name):
print(name)
print(type(name))
print(*name)# 这边就是解包操作,将容器里的元素全部取出
func('猪',1,123,'FishC','Cool',)
输出结果:
('猪', 1, 123, 'FishC', 'Cool', )
<class 'tuple'>
猪 1 123 FishC Cool
当不确定函数有多少个参数时装饰器内就可以用星号
def log(func):
def wrapper(*name):
print("开始执行")
s = func(*name)
# print("func=",s)
print("结束执行")
return s
return wrapper
@log
def eat(name, a, b, c, d, e):
print("%s正在执行程序"%name)
print(a, b, c, d, e)
return "%s正在执行程序"%name
x = eat("小甲鱼", 1, 2, 3, 4, 5)
print("func=", x) Twilight6 发表于 2020-7-30 09:48
在定义函数的时候,定义 *参数名 这个就代表这个参数可以传入不定数量的参数
并将各个参数以元组形 ...
大神能不改一改我的程序,让我看看怎么加参数,以及解包具体是什么效果, 如果 wrapper 的参数是固定的个数 n,那么这个装饰器只适用于有 n 个参数的函数。但用了星号就不一样了 Twilight6 发表于 2020-7-30 09:48
在定义函数的时候,定义 *参数名 这个就代表这个参数可以传入不定数量的参数
并将各个参数以元组形 ...
谢谢大神{:10_288:} zltzlt 发表于 2020-7-30 09:49
当不确定函数有多少个参数时装饰器内就可以用星号
谢谢大哥{:10_288:} Congratulate 发表于 2020-7-30 09:52
谢谢大神
{:10_250:} 我上面重新举了例子,你看看 Twilight6 发表于 2020-7-30 09:52
我上面重新举了例子,你看看
好,谢谢{:10_275:} Congratulate 发表于 2020-7-30 09:52
谢谢大哥
选个最佳吧{:10_250:}
页:
[1]