python类装饰器详解,python装饰器--原来如此简单
本文主要介绍Python decorator的定义和使用细节。decorator在现有函数上增加额外函数的函数本质上是一个闭包函数。关于以下的更多信息,可以参考一下。
00-1010 1.装饰者的定义2。装饰者一般类型的定义3。多个装饰者同时装饰一个功能。多个装修工同时装修一个功能(2) 5。类装饰器的用法6。利用装饰器自动维护路由表。
目录
装饰器:s函数是在现有函数的基础上增加额外的函数,本质上是一个闭包函数。
特点:
1.不要修改现有函数的源代码;2.不要修改现有函数的调用方式;3.向现有函数添加附加函数;4.执行代码时,首先分析装饰器的导入时间。
#装饰原则
# def show():
# n=0
#对于范围(10000000):内的I
# n=i
# print(show_ ,n)
#
# #定义一个闭包
# def count_time(趣味):
# def inner():
# start=time.time()
#乐趣()
# end=time.time()
# print(f 花费{end-start}秒)
#返回内部
#
# #装饰函数时装饰器的原则
# show=count_time(显示)
#显示()
#定义装饰者(语法糖)
DEF _ TIME (FUN) 3360 #必须有一个参数来接收修饰函数
内部定义():
start=time.time()
乐趣()
end=time.time()
打印(f 花费{end-start}秒)
返回内部
# Decorator写成:@闭包的外部函数,闭包设置后必须使用。
打印(解决装饰1 )
@count_time #解释为show=count_time(show),在count_time函数中show指向inner。
定义显示():
n=0
对于I,范围为(10000000):
n=i
打印( show_ ,n)
打印(“解析装饰器2”)
@count_time #解释为display=count_time(display)
定义显示():
打印(“显示”)
打印(正式执行.)
显示()
显示()
1.装饰器的定义
(当修饰函数有参数或返回值时,同样适用)
装饰器的一般类型的定义(当被装饰的函数有参数或返回值时同样适用)
外部定义(功能):
definer(* args,* * kwargs) : # *解包元组和列表,* *解包字典。
打印( **30)
打印(args,kwargs)
Ret=func(*args,**kwargs) # Unpack,否则参数为tuple或dictionary。
打印( **30)
返回ret
返回内部
@外部
定义显示(名称,消息):
返回字符串(名称) say: 字符串(消息)
打印(显示( Tom ,msg=Hello ))
2.装饰器的通用类型的定义
#第一次关闭
def wrapper_div(函数):
def inner(*args,**kwargs):
return div func(*args,**kwargs) /div
返回内部
#第二次关闭
定义包装_p(func):
定义在
ner(*args,**kwargs):
return <p>+func(*args,**kwargs)+</p>
return inner
# 从下往上装饰,从上往下执行
@wrapper_div
@wrapper_p
# 定义一个函数
def show():
return Short life I use Python.
print(show()) #<div><p>Short life I use Python.</p></div>
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.inner
2.outer1.inner.func指向outer2.inner
3.outer2.inner.func指向show
@outer1
@outer2
def show():
print(Show...)
show()
5.类装饰器使用方法
import timeclass 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装饰器的定义和使用详情的文章就介绍到这了,更多相关Python装饰器内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。