如何正确用装饰器
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"如何正确用装饰器",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何正确用装饰器"吧!1. 问题大概问题是这样,想要自定义一个Pyt
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
互联网科技园
北京路客互联网科技有限公司
深圳互联网科技公司
互联网金融公司科技
深圳互联网络科技有限公司
为想互联网科技
以房互联网科技
互联网与未来科技
小马过河互联网科技
赫美联合互联网科技
齐家互联网科技有限公司
四川狮子座互联网科技
互联网金融和金融科技
济南和联互联网科技有限公司
互联网科技和信息
科技类公司包括互联网吗
美国互联网科技实力
互联网领先科技宣传片
萌小萌互联网科技河南有限公司
广州全民伙伴互联网科技有限公司
广州百单互联网科技有限公司
有木互联网科技
广州紫鲸互联网科技
济南和联互联网科技有限公司
移动互联网科技股
和信科技工业互联网
知域互联网科技有限公司大骗子
河南住房之家互联网科技
互联网金融运营模式中的金融科技
互联网科技品牌