千家信息网

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

0