Python中的@符号是装饰器的意思。Python中装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。

  • 实质:是一个函数
  • 参数:是你要装饰的函数名(并非函数调用)
  • 返回:是装饰完的函数名(也不是函数调用)
  • 作用:为已经存在的对象添加额外的功能。
  • 特点:不需要对对象做任何的代码上的变动。

Python装饰器有很多经典的应用场景,比如:插入日志,性能测试,事务处理,权限校验等。装饰器是解决这类问题的绝佳设计。

装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组件多个特定的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时,因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑。

定义一个能打印日志的doctorator:

def log(func):def wrapper(*args, **kw):print('call %s():' % func.__name__)return func(*args, **kw)return wrapper@log
def now():print('2021-3-25')if __name__ == '__main__':now()

执行结果:

函数对象有一个__name__属性,可以拿到函数的名字。

调用now()函数,不仅会运行now()函数本身,还会在运行now()函数前打印一行日志。

把@log放到now()函数的定义处,相当于执行了语句:

now = log(now)

wrapper()函数的参数定义是(*args,**kw),因此,wrapper()函数可以接收任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数:

def log(text):def decorator(func):def wrapper(*args, **kw):print('%s %s():' % (text, func.__name__))return func(*args, **kw)return wrapperreturn decorator@log('execute')
def now():print('2015-3-25')if __name__ == '__main__':now()

执行结果:

和两层嵌套的decorator相比,3层嵌套的效果是这样的:

now = log('execute')(now)

首先执行log(‘execute’),返回的是decorator函数,再调用返回的函数,参数就是now函数,返回值最终是wrapper函数。

函数也是对象,它有__name_等属性,但你去看经过decorator装饰之后的函数,他们的__name__已经从原来的’now’变成了’wrapper’:

print(now.__name__) #输出:wrapper

因为返回的那个wrapper()函数名字就是’wrapper’,所以,需要把原始函数的__name__等属性赋值到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。

Python内置的functiontools.wraps就是干这个事的,所以,一个完整的decorator的写法如下:

import functoolsdef log(func):@functools.wraps(func)def wrapper(*args, **kw):print('call %s():' % func.__name__)return func(*args, **kw)return wrapper

或者

import functoolsdef log(text):def decorator(func):@functools.wraps(func)def wrapper(*args, **kw):print('%s %s():' % (text, func.__name__))return func(*args, **kw)return wrapperreturn decorator

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:pythoner666,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

Python中@符号是什么意思?相关推荐

  1. python中符号的用法_python中的@符号的作用

    '@'符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行.也就是说@A def f(): 是非法的.只可以在模块或类定义层内对函数进行修饰,不 ...

  2. python中符号输入_Python基础(输入、运算符)

    输入 1. python2版本中 1.1 使用 raw_input()函数, 看如下示例: password = raw_input("请输入密码:") print ('您刚刚输入 ...

  3. Python中//符号是什么意思?

    Python中的//是向下取整的意思 a//b,应该是对除以b的结果向负无穷方向取整后的数 举例: 5//2=2(2.5向负无穷方向取整为2),同时-5//2=-3(-2.5向负无穷方向取整为-3)

  4. python中符号 ~ 的意义和用法

    ~ 在python中为反转的意思, 目前我知道的有两种用法. 一. 数值按位翻转 ~ x 就是 - ( x + 1) x = 2 print(~x) -3 二. 布尔值取反 直接看案例 import ...

  5. python中θ符号怎么打出来_利用python打印特殊符号

    原博文 2020-05-02 19:57 − 1.方法一,调用字符映射表输入特殊符号 在键盘上按win+R,在打开的对话框中输入"charmap",会出现字符映射表: 2.利用字符 ...

  6. Python 中@符号解释

    1.基本含义 @符号用做函数的修饰符,可以在模块或者类的定义层内对函数进行修饰,出现在函数定义的前一行,不允许和函数定义在同一行. 一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名 ...

  7. python中θ符号怎么打出来_各种符号在键盘上怎么打出来?

    展开全部 键盘2113上已有的的符号打法 (1)键盘上有5261的一个键上有两个符号的,4102如图所示: (2)如果想打1653键上面符号,则可以按住Shift,即可打出上面的字符,例如按住和< ...

  8. python中θ符号怎么打出来_怎么打特殊符号

    1.在聊天窗口中,切换到智能ABC输入法后,按下字符V键,再按下1-9之间的任何数字键后将出现特殊字符,在使用键盘上面的+号翻页可以打出更多的特殊字符来: 2. 使用QQ拼音输入法打出特殊字符: 同样 ...

  9. python中%符号详解

    %a 星期几的简写 %A 星期几的全称 %b 月分的简写 %B 月份的全称 %c 标准的日期的时间串 %C 年份的后两位数字 %d 十进制表示的每月的第几天 %D 月/天/年 %e 在两字符域中,十进 ...

最新文章

  1. PyTorch训练加速17种技巧
  2. 项目要开始,应该提出什么样的要求?
  3. Spring常用工具类
  4. hdu-2544(简单djikstra)
  5. django html跳转页面跳转页面,Django html单击打开另一个html页面
  6. java登录界面命令_Java命令行界面(第16部分):JArgp
  7. mybatis级联查询list_MyBatis手把手跟我做系列(四) ---级联查询与懒加载
  8. IDEA连接PostgreSQL数据库
  9. C#多屏幕显示器编程
  10. mysqldump mysql.sock_mysqldump原理及实战
  11. 13. jQuery - 设置内容和属性
  12. 小波变换 分离影像低频部分_连续小波变换(1)
  13. TiledMap 使用
  14. mac苹果电脑使用耳机听不到声音
  15. [每日一氵] Python以管理员权限运行程序
  16. ajax怎么传递list类型参数到后端,ajax传递给后台数组参数方式
  17. h5加java棋牌_Html5斗地主棋牌架设Canvas实现斗地主游戏代码解析
  18. DDSM+RetinaNet数据处理进展
  19. python离散积分_python 计算离散点的微分和积分(超详细)
  20. arcgis api for javaScript学习-Measurement

热门文章

  1. Java基础语法的思维导图
  2. http超大文件上传方案
  3. 关于正确处理0x80070426等错误的方法
  4. kotlin协程+retrofit简单取消接口回调
  5. SHEPWM特定消谐选择性谐波消除
  6. jaeger client java_grpc分布式链路跟踪之jaeger
  7. C#:Krypton控件使用方法详解(第十六讲) ——kryptonCheckedListBox
  8. batocera整合包_OGA 官方固件 + Retroarch + 睡眠模式 ES整合包
  9. linux下kegg注释软件,工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧...
  10. JAVA程序设计:买卖股票的最佳时机含手续费(LeetCode:714)