鱼C论坛

 找回密码
 立即注册
查看: 2232|回复: 9

[已解决]装饰器中星号*问题

[复制链接]
发表于 2020-7-30 09:45:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
书上只是说星号可以解包。但程序给的参数还是一个。我也不清楚具体怎么用。有没有大神写一个多参数的装饰器,让我看看星号的用法到底是怎么用的,以及星号所展示的效果是什么样的
下面是我根据书上,照书话葫芦写的代码(但我看不出这个星号*的用处到底体现在哪里)


  1. def log(func):
  2.     def wrapper(*name):
  3.         print("开始执行")
  4.         s = func(*name)
  5.         # print("func=",s)
  6.         print("结束执行")
  7.         return s
  8.     return wrapper

  9. @log
  10. def eat(name):
  11.     print("%s正在执行程序"%name)
  12.     return "%s正在执行程序"%name


  13. x = eat("小甲鱼")
  14. print("func=", x)
复制代码
最佳答案
2020-7-30 09:49:06
当不确定函数有多少个参数时装饰器内就可以用星号

  1. def log(func):
  2.     def wrapper(*name):
  3.         print("开始执行")
  4.         s = func(*name)
  5.         # print("func=",s)
  6.         print("结束执行")
  7.         return s
  8.     return wrapper

  9. @log
  10. def eat(name, a, b, c, d, e):
  11.     print("%s正在执行程序"%name)
  12.     print(a, b, c, d, e)
  13.     return "%s正在执行程序"%name


  14. x = eat("小甲鱼", 1, 2, 3, 4, 5)
  15. print("func=", x)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 09:48:46 | 显示全部楼层
本帖最后由 Twilight6 于 2020-7-30 09:52 编辑



这个并不是装饰器特有的哈,只要在定义函数的时候,定义 * 参数名 这个就代表这个参数可以传入不定数量的参数

并将各个参数以元组形式储存在 参数名 中,比如你这里的 *name ,传入的参数最终都在 name 元组中的元素

当在函数内直接  *name 就是解包,就是将 name 里面的元素全部取出

看个例子:
  1. name = (1,2,3,'abc',5,6)
  2. print(*name)
复制代码
输出结果:
  1. 1 2 3 'abc' 5 6
复制代码
输出了这 6 个参数


  1. def func(*name):
  2.     print(name)
  3.     print(type(name))
  4.     print(*name)  # 这边就是解包操作,将容器里的元素全部取出

  5. func('猪',1,123,'FishC','Cool',[1,2,3,4,5])
复制代码


输出结果:
  1. ('猪', 1, 123, 'FishC', 'Cool', [1, 2, 3, 4, 5])
  2. <class 'tuple'>
  3. 猪 1 123 FishC Cool [1, 2, 3, 4, 5]
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-30 09:49:06 | 显示全部楼层    本楼为最佳答案   
当不确定函数有多少个参数时装饰器内就可以用星号

  1. def log(func):
  2.     def wrapper(*name):
  3.         print("开始执行")
  4.         s = func(*name)
  5.         # print("func=",s)
  6.         print("结束执行")
  7.         return s
  8.     return wrapper

  9. @log
  10. def eat(name, a, b, c, d, e):
  11.     print("%s正在执行程序"%name)
  12.     print(a, b, c, d, e)
  13.     return "%s正在执行程序"%name


  14. x = eat("小甲鱼", 1, 2, 3, 4, 5)
  15. print("func=", x)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-30 09:51:44 | 显示全部楼层
Twilight6 发表于 2020-7-30 09:48
在定义函数的时候,定义 *参数名 这个就代表这个参数可以传入不定数量的参数

并将各个参数以元组形 ...

大神能不改一改我的程序,让我看看怎么加参数,以及解包具体是什么效果,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 09:51:58 | 显示全部楼层
如果 wrapper 的参数是固定的个数 n,那么这个装饰器只适用于有 n 个参数的函数。但用了星号就不一样了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-30 09:52:21 | 显示全部楼层
Twilight6 发表于 2020-7-30 09:48
在定义函数的时候,定义 *参数名 这个就代表这个参数可以传入不定数量的参数

并将各个参数以元组形 ...

谢谢大神
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-30 09:52:53 | 显示全部楼层
zltzlt 发表于 2020-7-30 09:49
当不确定函数有多少个参数时装饰器内就可以用星号

谢谢大哥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 09:52:58 | 显示全部楼层

我上面重新举了例子,你看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-30 09:54:23 | 显示全部楼层
Twilight6 发表于 2020-7-30 09:52
我上面重新举了例子,你看看

好,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 09:55:48 | 显示全部楼层

选个最佳吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 04:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表