找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 5248|回复: 3

[求助] python装饰器求解

1

主题

1

帖子

1

积分

贫民

积分
1
stayfoolish 发表于 2017-5-30 22:31:28 | 显示全部楼层 |阅读模式
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper       
@log
def now():
    print('2015-3-25')

为什么中间要嵌套wrapper函数,为什么不可以这样?

def log(func):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
@log
def now():
    print('2015-3-25')


回复

使用道具 举报

0

主题

14

帖子

14

积分

贫民

积分
14
Chiao_Hou 发表于 2017-5-31 19:03:56 | 显示全部楼层
可以啊。

不过源代码应该是这样的吧?
  1. from functools import wraps


  2. def log(func):
  3.     @wraps(wraps)
  4.     def wrapper(*args, **kwargs):
  5.         print('call %s():' % func.__name__)
  6.         return func(*args, **kwargs)

  7.     return wrapper


  8. @log
  9. def now():
  10.     print('2015-3-25')


  11. now()
复制代码



回复 支持 反对

使用道具 举报

1

主题

8

帖子

8

积分

贫民

积分
8
jialan22010 发表于 2017-6-2 14:51:01 来自手机 | 显示全部楼层
可以,但不用函数嵌套的话,假如func()有参数的话,装饰器无法给被装饰的函数传参数
回复 支持 反对

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
linzhifeng 发表于 2017-6-2 20:08:34 | 显示全部楼层
你直接试试第二段代码,会出现两问题,第一如前面所说装饰器无法给被装饰的函数传参数,第二,即使不调用now()函数.  print('call %s():' % func.__name__)也会被执行,因为装饰器是在装饰的时候运行的
回复 支持 反对

使用道具 举报

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

本版积分规则

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