Python装饰器的定义和使用方法是什么
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,本篇内容主要讲解"Python装饰器的定义和使用方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python装饰器的定义和使用方法是什么"吧!1.
千家信息网最后更新 2025年01月16日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安全错误
数据库的锁怎样保障安全
数据库课件事务
买服务器做vps
腾讯网络服务器怎么样了
签合同的日期可以是合同服务器
智能互联网络技术专升本考什么
软件开发报道
生物医学文献数据库有哪些
数据库查询选了特定科目的学生
linux数据库入门教程交流
我的专业作文计算机网络技术
香港租服务器流程
我的世界服务器实用的生存房
网络安全发展技术
软件开发转行干别的
中国网络安全测评中心主任
系统集成与软件开发哪个好
服务器的吞吐量
大美綦江网络安全答案
江苏智能软件开发要多少钱
配置到云服务器
利用电信网络技术手段实施
绝世战魂正传和服务器区别
vcmp 服务器ip
税控服务器管理系统插件
设备管理服务器的搭建
狗狗视频软件开发
网络安全与大数据管理论文
360家电网络安全
计算机网络技术技能教程
系统软件开发服务