如何正确用装饰器
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章主要讲解了"如何正确用装饰器",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何正确用装饰器"吧!1. 问题大概问题是这样,想要自定义一个Pyt
千家信息网最后更新 2025年02月03日如何正确用装饰器
这篇文章主要讲解了"如何正确用装饰器",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何正确用装饰器"吧!
1. 问题
大概问题是这样,想要自定义一个Python装饰器,问我这样写装饰器行不行?如果不行,那又是为什么?
import datetime import time def print_time(g): def f(): print('开始执行时间') print(datetime.datetime.today()) g() print('结束时间') print(datetime.datetime.today()) f()
下面使用 print_time装饰函数 foo:
@print_time def foo(): time.sleep(2) print('hello world')
当调用 foo函数时,抛出如下异常:
foo() --------------------------------------------------------------------------- TypeError Traceback (most recent call last)in ----> 1 foo() TypeError: 'NoneType' object is not callable
所以,按照如上定义 print_time装饰器,肯定是不行的。
2. 为什么不行
要想明白为啥不行,首先要知道装饰器这个语法的本质。其实很简单,@print_time装饰foo函数等于:
foo = print_time(foo)
就是这一行代码,再也没有其他。
因为上面的 print_time 无返回值,所以赋值给 foo 函数后,foo 函数变为 None,所以当调用 foo() 时抛出 'NoneType' object is not callable
这也就不足为奇了。
3. 应该怎么写
print_time 需要返回一个函数,这样赋值给 foo函数后,正确写法如下所示:
import datetime import time def print_time(g): def f(): print('开始执行时间') print(datetime.datetime.today()) g() print('结束时间') print(datetime.datetime.today()) return f
装饰 foo:
@print_time def foo(): time.sleep(2) print('hello world')
调用 foo ,运行结果如下:
foo() 开始执行时间 2021-04-02 22:32:49.114124 hello world 结束时间 2021-04-02 22:32:51.119506
一切正常
4. 装饰器好处
上面自定义print_time装饰器,除了能装饰foo函数外,还能装饰任意其他函数和类内方法。
装饰任意一个函数 foo2:
@print_time def foo2(): print('this is foo2')
装饰类内方法 foo3,需要稍微修改原来的print_time:
def print_time(g): def f(*args, **kargs): print('开始执行时间') print(datetime.datetime.today()) g(*args, **kargs) print('结束时间') print(datetime.datetime.today()) return f
为类MyClass中foo3方法增加print_time装饰:
class MyClass(object): @print_time def foo3(self): print('this is a method of class')
执行结果如下:
MyClass().foo3() 开始执行时间 2021-04-02 23:16:32.094025 this is a method of class 结束时间 2021-04-02 23:16:32.094078
以上就是装饰器的通俗解释,平时可以多用用,让我们的代码更加精炼、可读。
感谢各位的阅读,以上就是"如何正确用装饰器"的内容了,经过本文的学习后,相信大家对如何正确用装饰器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
函数
时间
不行
就是
方法
问题
学习
代码
内容
结果
通俗
不足为奇
一行
写法
又是
多用用
好处
如上
思路
情况
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发企业的会计分录
首都网络安全日赛事
老式台式电脑nas服务器
魔兽tbc 服务器人数在哪里查
计算机网络技术是怎样出现的
服务器异常c00002
华为云服务器磁盘扩容
校园宽带网络安全检查
数据库教程简笔画简单
网络安全日在线阅读
无锡博世软件开发公司
软件开发一流公司
网络安全培训情况
无基础学软件开发学费
网络安全题nmap
存储设备需要安装数据库软件吗
网络安全事件最高响应级别
疫情精神与网络安全
旧笔记本改打印机服务器
浙江ntp时钟服务器地址
怎么获取云服务器存储的数据
网络技术单招山东
dell服务器安装教程
中文全文数据库的使用
阿里云服务器能转让吗
汉寿跑胡子软件开发
sas怎么更新数据库
电子商务网络技术包括什么
探究小鼠的数据库
数据库显示下拉列表不见了