Python装饰器的定义和使用方法是什么
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"Python装饰器的定义和使用方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python装饰器的定义和使用方法是什么"吧!1.
千家信息网最后更新 2026年11月01日Python装饰器的定义和使用方法是什么
本篇内容主要讲解"Python装饰器的定义和使用方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python装饰器的定义和使用方法是什么"吧!
1.装饰器的定义
装饰器:给已有函数增加额外的功能的函数,本质上是一个闭包函数
特点:
1.不修改已有函数的源代码
2.不修改已有函数的调用方式
3.给已有函数增加额外的功能
4.代码执行时先解析装饰器
import time # 装饰器原理# def show():# n=0# for i in range(10000000):# n+=i# print('show_',n)## # 定义一个闭包# def count_time(fun):# def inner():# start=time.time()# fun()# end=time.time()# print(f'用时{end-start}秒')# return inner## # 装饰器在装饰函数时的原理# show=count_time(show)# show() # 定义装饰器(语法糖)def count_time(fun): # 必须要有一个参数接收被装饰函数 def inner(): start=time.time() fun() end=time.time() print(f'用时{end-start}秒') return inner# 装饰器写法:@闭包的外部函数,必须在闭包定以后使用print('解析装饰器1')@count_time # 解释成show=count_time(show),show指向count_time函数中的innerdef show(): n=0 for i in range(10000000): n+=i print('show_',n) print('解析装饰器2')@count_time # 解释成display=count_time(display)def display(): print('Display') print('正式执行...')show()display()2.装饰器的通用类型的定义
(当被装饰函数有参数或者有返回值时同样适用)
'''装饰器的通用类型的定义(当被装饰函数有参数或者有返回值时同样适用)''' def outer(func): def inner(*args,**kwargs): # *为元组和列表解包,**为字典解包 print('*'*30) print(args,kwargs) ret=func(*args,**kwargs) # 解包,否则形参是元组或字典 print('*'*30) return ret return inner @outerdef show(name,msg): return str(name)+' say: '+str(msg) print(show('Tom',msg='Hello'))3.多个装饰器同时装饰一个函数
# 第一个闭包def wrapper_div(func): def inner(*args,**kwargs): return ''+func(*args,**kwargs)+'' return inner # 第二个闭包def wrapper_p(func): def inner(*args,**kwargs): return ''+func(*args,**kwargs)+'
' return inner # 从下往上装饰,从上往下执行@wrapper_div@wrapper_p# 定义一个函数def show(): return 'Short life I use Python.' print(show()) #Short life I use Python.
4.多个装饰器同时装饰一个函数(二)
def outer1(func): def inner(): print('装饰器1-1') func() print('装饰器1-2') return inner def outer2(func): def inner(): print('装饰器2-1') func() print('装饰器2-2') return inner'''1.show指向outer1.inner2.outer1.inner.func指向outer2.inner3.outer2.inner.func指向show'''@outer1@outer2def show(): print('Show...') show()5.类装饰器使用方法
import time class Wrapper(): def __init__(self,func): self.func=func # 当类中实现了此方法时,该类的实例对象就变成了可调用对象,即可以在实例对象后面加() def __call__(self, *args, **kwargs): print('装饰内容1...') start=time.time() ret=self.func(*args,**kwargs) end=time.time() print(f'执行了{end-start}秒') print('装饰内容2...') return ret该装饰器执行完成后,被装饰函数指向该类的实例对象
如果让被装饰函数执行,那么在类中要添加__call__方法,相当于闭包格式中的内函数
一旦被装饰函数执行调用,那么就会去执行实例对象中的__call__函数
@Wrapper #解释成show=Wrapper(show),show变成了类的一个对象def show(): print('Show...') show()6.装饰器带有参数(使用带有参数的装饰器,其实是在装饰器外面又包裹了一个函数)# @Author : Kant# @Time : 2022/1/23 22:43 def set_args(msg): def outer(func): def inner(): print('装饰内容',msg) func() return inner return outer '''使用带有参数的装饰器,其实是在装饰器外面又包裹了一个函数,使用该函数接收参数,返回的是装饰器调用set_args()后会返回outer的地址引用,变成了@outer'''@set_args('Hello')# 无论闭包函数写成什么样子,被装饰函数永远指向闭包函数的内函数def show(): print('Show...') show()6.使用装饰器实现自动维护路由表
路由功能:通过请求的路径,可以找到资源的地址
# 定义一个路由表字典router_table={}def router(url): def wrapper(func): def inner(): print('1') print('inner-',func) # 查看当前的被装饰函数是谁 func() # 在这里维护路由表字典 router_table[url]=inner # 如果写func,inner函数中的内容都不会执行 print('路由表字典:',router_table) return inner return wrapper @router('index.html')def index(): print('首页内容') @router('center.html')def center(): print('个人中心') @router('mail.html')def mail(): print('邮箱页面') @router('login.html')def login(): print('登录页面') def error(): print('访问页面不存在') def request_url(url): func=error if url in router_table: func=router_table[url] func() print('开始执行函数')request_url('index.html')request_url('center.html')request_url('mail.html')request_url('test.html')request_url('login.html')到此,相信大家对"Python装饰器的定义和使用方法是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
函数
闭包
内容
参数
方法
对象
指向
字典
路由
使用方法
实例
功能
页面
解释
包裹
原理
同时
地址
增加额
多个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网金融科技
互联网科技海报
中关村互联网 科技集团
科技金融是不是互联网金融
互联网科技保险
互联网品科技
科技企业和互联网企业
互联网下的科技发展
有马互联网科技
互联网金融科技平台
上海致骋互联网科技
互联网科技公司名称
汽车互联网创新科技园
栖莱科技互联网股份有限公司
互联网和黑科技的看法
互联网公司科技股
北京市互联网新科技
互联网公司属于科技吗
保山互联网科技靠谱吗
恒生互联网科技趋势
手磨咖啡
江苏根荣互联网科技
科技金融是不是互联网金融
互联网科技公司华为
互联网与科技金融数据
左右互联网络科技
996高科技互联网公司
互联网公司黑科技创始人
华人运通互联网科技公司
网互联网络科技