Congratulate 发表于 2020-7-30 09:45:07

装饰器中星号*问题

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

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: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, 123, 'FishC', 'Cool', )
<class 'tuple'>
猪 1 123 FishC Cool

zltzlt 发表于 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)

Congratulate 发表于 2020-7-30 09:51:44

Twilight6 发表于 2020-7-30 09:48
在定义函数的时候,定义 *参数名 这个就代表这个参数可以传入不定数量的参数

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

大神能不改一改我的程序,让我看看怎么加参数,以及解包具体是什么效果,

zltzlt 发表于 2020-7-30 09:51:58

如果 wrapper 的参数是固定的个数 n,那么这个装饰器只适用于有 n 个参数的函数。但用了星号就不一样了

Congratulate 发表于 2020-7-30 09:52:21

Twilight6 发表于 2020-7-30 09:48
在定义函数的时候,定义 *参数名 这个就代表这个参数可以传入不定数量的参数

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

谢谢大神{:10_288:}

Congratulate 发表于 2020-7-30 09:52:53

zltzlt 发表于 2020-7-30 09:49
当不确定函数有多少个参数时装饰器内就可以用星号

谢谢大哥{:10_288:}

Twilight6 发表于 2020-7-30 09:52:58

Congratulate 发表于 2020-7-30 09:52
谢谢大神

{:10_250:} 我上面重新举了例子,你看看

Congratulate 发表于 2020-7-30 09:54:23

Twilight6 发表于 2020-7-30 09:52
我上面重新举了例子,你看看

好,谢谢{:10_275:}

zltzlt 发表于 2020-7-30 09:55:48

Congratulate 发表于 2020-7-30 09:52
谢谢大哥

选个最佳吧{:10_250:}
页: [1]
查看完整版本: 装饰器中星号*问题