鱼C论坛

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

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

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

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

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

x
书上只是说星号可以解包。但程序给的参数还是一个。我也不清楚具体怎么用。有没有大神写一个多参数的装饰器,让我看看星号的用法到底是怎么用的,以及星号所展示的效果是什么样的
下面是我根据书上,照书话葫芦写的代码(但我看不出这个星号*的用处到底体现在哪里)
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)
最佳答案
2020-7-30 09:49:06
当不确定函数有多少个参数时装饰器内就可以用星号
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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 09:48:46 | 显示全部楼层
本帖最后由 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,2,3,4,5])

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-30 09:49:06 | 显示全部楼层    本楼为最佳答案   
当不确定函数有多少个参数时装饰器内就可以用星号
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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

大神能不改一改我的程序,让我看看怎么加参数,以及解包具体是什么效果,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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

谢谢大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢大哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我上面重新举了例子,你看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

选个最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 10:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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