您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
本篇内容主要讲解“Python装饰器的定义和使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python装饰器的定义和使用方法是什么”吧!
装饰器:给已有函数增加额外的功能的函数,本质上是一个闭包函数
特点:
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函数中的inner def 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()
(当被装饰函数有参数或者有返回值时同样适用)
''' 装饰器的通用类型的定义(当被装饰函数有参数或者有返回值时同样适用) ''' def outer(func): def inner(*args,**kwargs): # *为元组和列表解包,**为字典解包 print('*'*30) print(args,kwargs) ret=func(*args,**kwargs) # 解包,否则形参是元组或字典 print('*'*30) return ret return inner @outer def show(name,msg): return str(name)+' say: '+str(msg) print(show('Tom',msg='Hello'))
# 第一个闭包 def wrapper_div(func): def inner(*args,**kwargs): return '<div>'+func(*args,**kwargs)+'</div>' return inner # 第二个闭包 def wrapper_p(func): def inner(*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>
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()
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()
路由功能:通过请求的路径,可以找到资源的地址
# 定义一个路由表字典 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装饰器的定义和使用方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。