文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python装饰器的定义和使用方法是什么

2023-06-30 00:21

关注

本篇内容主要讲解“Python装饰器的定义和使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python装饰器的定义和使用方法是什么”吧!

1.装饰器的定义

装饰器:给已有函数增加额外的功能的函数,本质上是一个闭包函数

特点:

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 '<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>

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装饰器的定义和使用方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯