| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 
我先定义一个闭包 
- def logger(func):
 
 -     def call_func():
 
 -         print("----------")
 
 -         func()
 
 -         print("----------")
 
 -     return call_func
 
  复制代码 
 
再给一个含参函数加上该闭包的装饰器 
- @logger
 
 - def sayhi(name):
 
 -     print("hi,{}".format(name))
 
  复制代码 
 
然后函数sayhi()就没法用了 
- sayhi("小甲鱼")
 
 - Traceback (most recent call last):
 
 -   File "<pyshell#38>", line 1, in <module>
 
 -     sayhi("小甲鱼")
 
 - TypeError: logger.<locals>.call_func() takes 0 positional arguments but 1 was given
 
  复制代码 
 
求帮助  
一个函数在使用装饰器后会被替换成装饰器的返回值, 
 
而装饰器的返回值 call_func 不接受任何参数,故而你给 sayhi 传参会报错, 
 
所以就是要让 call_func 接收跟 sayhi 的参数个数一样的形参,并在 call_func 调用 sayhi 的时候把参数传递给 sayhi 
 
故对你的代码修改如下: 
 
- def logger(func):
 
 -     def call_func(name):                         # 改了这里
 
 -         print("----------")
 
 -         func(name)                         # 改了这里
 
 -         print("----------")
 
 -     return call_func
 
  
- @logger
 
 - def sayhi(name):
 
 -     print("hi,{}".format(name))
 
  
- sayhi("小甲鱼")
 
  复制代码 
 
 
 |   
 
 
 
 |