Python学习基础笔记十九——装饰器
admin
2024-04-16 21:38:17
0

装饰器的形成过程:

import timedef func1():print('in func1')start = time.time()
func1()
end = time.time()
print(end - start)

再进一步:

import timedef timer(f):          # 计算函数执行时间,将函数名作为参数start = time.time()f()                # 执行函数end = time.time()print(end - start)def func():print("Hello world!")timer(func)

第二次进化:

import timedef func():print("Hello world!")def timer(f):         # 装饰器def inner():       # 闭包start = time.time()f()           # 被装饰器函数end = time.time()print(end - start)return innerfunc = timer(func)func()

说明程序的运行过程:

第一步:def func():  func函数声明

第二步:def timer(func)  timer函数声明

第三步:func = timer(func)  先运行timer函数,传递func函数名(内存地址)

第四步:def inner():开始运行timer函数内部代码,声明inner函数

第五步:return inner: 返回inner内存地址

第六步:func = timer(func):  将timer的返回值(inner内存地址)传给func变量(实际也是内存地址,跟func函数的内存地址是一样的)

第七步:func() 开始执行func(),实际上执行的就是inner函数,因为将inner内存地址赋值给了func变量的内存地址。

第八步:start = time.time(), 开始到inner函数内部开始执行,从这步开始,获得当前系统时间赋值给start变量。

第九步:f(), 开始执行f函数,该f,就是上一层timer函数传递进来的参数func。

第十步:print("Hello world!")然后执行func函数内部代码,执行完毕,即退出func函数。

第十一步:end = time.time(), 获得当前系统时间,赋值给end变量。

第十二步:print(end - start), 然后获得两个时间时间差,并打印,到这一步,inner函数执行完毕,退出inner。

第十三步:到func()调用函数的下一行。

装饰器的作用:

不想修改函数的调用方式,但是还想在原来的函数的前后添加新功能,timer是一个装饰器函数,只是对一个函数有一些装饰作用。

从上面的代码可见,timer是装饰器函数,f() 是被装饰的函数。

进一步变化:

import timedef timer(f):def inner():start = time.time()f()end = time.time()print(end - start)return inner@timer             # 装饰器函数名
def func():        # 被装饰的函数名print("Hello world!")# func = timer(func)func()

注意其中的@timer的位置。

再进一步,注意其中对返回值的处理:

import timedef timer(f):def inner():start = time.time()ret = f()end = time.time()print(end - start)return retreturn inner@timer             # 装饰器函数名
def func():        # 被装饰的函数名print("Hello world!")return '新年好'# func = timer(func)ret = func()
print(ret)

如果func有返回值,看看装饰器函数timer中是怎么处理的,然后调用的时候也要注意下这个返回值。

再进一步:

import timedef timer(f):def inner(a):start = time.time()ret = f(a)end = time.time()print(end - start)return retreturn inner@timer             # 装饰器函数名
def func(a):        # 被装饰的函数名print("Hello world!", a)return '新年好'# func = timer(func)ret = func(1)
print(ret)

装饰带参数函数的装饰器。有了对带参数的处理。

进一步变化, 万能参数:

import timedef timer(f):def inner(*args, **kwargs):start = time.time()ret = f(*args, **kwargs)end = time.time()print(end - start)return retreturn inner@timer             # 装饰器函数名
def func(a):        # 被装饰的函数名print("Hello world!", a)return '新年好'@timer             # 装饰器函数名
def func(a, b):        # 被装饰的函数名print("Hello world!", a, b)return '新年好'# func = timer(func)ret = func(1)
print(ret)

最后,我们再将装饰器简化:

def wrapper(f):                    # 装饰器wrapperdef inner(*args, **kwargs):  '''在装饰前要做的事情'''  ret = f(*args, **kwargs)   # 被装饰的函数'''在装饰后要做的事情'''return retreturn inner@wrapper                           # 装饰器函数名
def func(a, b):                    # 被装饰的函数

这个就是一个装饰器固定模式。

原则:开放封闭原则:

开放:对扩展是开放的。

封闭:对修改是封闭的。

目的是维护代码的稳定性,那么这个就是装饰器存在的意义。

相关内容

热门资讯

提前布局硬科技企业,银行系“耐... 国产DRAM龙头长鑫科技7月16日启动科创板新股申购。招股书显示,金融资产投资公司(AIC)等银行系...
沈阳本地有哪些可满足小单需求的... 沈阳本地定制服装行业需求现状 近年来沈阳本地各类企事业单位的文化建设、活动筹办、员工工装配置需求处于...
25.47万亿元!上半年外贸创... 本报(chinatimes.net.cn)记者张智 北京报道 尽管今年外部环境复杂多变,但我国进出口...
四季陪伴 | 资产配置策略真的... 来源:中信银行微生活 01 一个无法回避的问题 2026年上半年结束了。打开账户,很多持有“四季组...
神秘大资金出手了。。 大资金再出手! 时隔15个月,ETF市场再现神秘资金抄底行情。 仅两个交易日,全市场股票ETF净流入...
梁文锋登顶全球大模型首富 据7月15日更新的彭博亿万富翁指数最新数据,DeepSeek创始人梁文锋以360亿美元净资产位列全球...
中央通报3起典型问题:国企投资... 2026年7月15日,中央层面整治形式主义为基层减负专项工作机制办公室和中央纪委办公厅公开通报3起整...
7月15日主题复盘 | 医药股... 一、行情回顾 市场全天震荡调整,科创50指数跌超4%。医药股逆势走强,迪哲医药、博瑞医药、昭衍新药等...
原创 莫... 印度这次跟美国的贸易谈判,摆出的架势让我们看了直摇头。莫迪政府张口就要"比中国还低的关税待遇",这个...
原创 今... 家人们谁懂啊,今早6点刷到的黄金分析还写着「4100横盘待变,4021是铁底」,结果8点半美国6月C...
近3亿套现落空!零售巨头物美集... 图片来源:图虫创意 横跨南北多省布局、拥有多个连锁品牌的老牌零售巨头——物美科技集团有限公司(以下简...
常州第一大独角兽企业:估值30... 根据胡润研究院的界定,独角兽企业指的是成立于2000年之后、估值超过10亿美元的非上市企业。这类企业...
长鑫科技回应董事长发股权激励,... 7月15日下午,存储厂商长鑫科技召开网上投资者交流会,该公司董事长朱一明在与投资者的交流中谈及公司登...
原创 D... 彭博、《金融时报》近期同步曝光,曾经宣称 “不融资、不上市、不商业化” 的 DeepSeek,正式推...
原创 7... 科创板史上最大IPO的发行价终于落地了。 长鑫科技每股定在8.66元,刚好卡在市场之前预测的7-10...
002731连续15个跌停后巨... 文/帅可聪 7月15日,在连续15个交易日跌停后,*ST萃华(002731.SZ)股价盘中出现异动。...
原创 4... 那个被全球资本疯狂追逐的电商巨头,终于要IPO了。 作者 | 云帆 来源 | 投资家(ID:touz...
上半年我国芯片日均产量超15亿... 国家统计局新闻发言人、国民经济综合统计司负责人王冠华7月15日在国新办新闻发布会上表示,今年上半年,...
从百人团队到近7000人!小米... 八载深耕积淀,科创步履不停。7月15日,小米集团华东总部迎来8周年生日。南京建邺区相关领导、小米集团...
原创 重... 2026年7月13日,国务院正式批复了《扩大消费"十五五"规划》。 目标写得明明白白,到2030年,...