Python进阶----装饰器

Posted dengl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python进阶----装饰器相关的知识,希望对你有一定的参考价值。

Python进阶(六)----装饰器

一丶开放封闭原则

开放原则:

? 增加一些额外的新功能

封闭原则:

? 不改变源码.以及调用方式

二丶初识装饰器

装饰器:

? 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包

###普通版装饰器
import time
def timmer(x):                  # x 接收的原函数的内存地址
    def inner():                    
        start_time=time.time()
        x()                     # 执行 原函数
        print(f'执行效率time.time()-start_time')
    return inner                

def index():                 
    time.sleep(2)
    print(f'欢迎访问本站博客园')

    
index=timmer(index)         #将timmer函数执行的结果返回,付给index变量      
index()                    #这里执行的inner函数



###标准版      @timmer是语法糖(黏贴在被装饰函数,先于执行被装饰函数),装饰器函数必写在被装饰函数之上.
import time
def timmer(func):       # 此时 func 就是一个自由变量
    def inner():
        start_time = time.time()
        func()          # func 是timmer函数传递过来的index原函数的内存地址
        print(f'执行效率 time.time() - start_time')
    return inner

@timmer                 # 等同于 index=timmer(index)  往下读一行
def  index():
    time.sleep(2)
    print('登录成功')

index()                #这里执行的inner函数

三丶被装饰器数带返回值

###需求被装饰函数有返回值

import time
def timmer(func):                 # 这里argv 接收的真正要执行的原函数.
    def inner():      
        start_time=time.time()
        var=func()  
        print(f'time.time()-start_time,args[0],args[1]')

        return var          #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
    return  inner           

@timmer
def index(*args,**kwargs):
    time.sleep(2)
    print('进入到网页index页面')
    return True                 # 原函数 最重返回的结果是 True


print(index(1,2))   # 这里是执行  inner方法

四丶被装饰函数带参数

###需求 被装饰函数有参数
import  time
def timmer(func):

    def inner(*args,**kwargs):        # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
        # 函数定义时 , * ,** 代表聚合
        
        start_time=time.time()
        
        res=func(*args,**kwargs)     # 执行真正的原函数, 将参数打散  func(1,2)
        # 函数执行时 ,* ,** 代表打散
        
        print(f'time.time()-start_time 这是args[0]')
        
        return res

    return inner

@timmer
def index(args):
    time.sleep(2)
    print(f'welcome args')
    return True

index('都来看')

五丶标准终终结版装饰器

######  装饰器原版   ####
def warpper(func):
    def inner(*args,**kwargs):
        '''被装饰器之前的操作'''
        ret=func(*args,**kwargs)
        '''被装饰函数之后的操作'''
        return ret
    return inner




####拓展版   计算index函数执行的效率

import  time
def timmer(func):
    
    def inner(*args,**kwargs):        # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
        # 函数定义时 , * ,** 代表聚合
        
        start_time=time.time()       
        
        res=func(*args,**kwargs)     # 执行真正的原函数, 将参数打散  func(1,2)
        # 函数执行时 ,* ,** 代表打散
        
        print(f'time.time()-start_time  这是args[0]')
    
        return res          #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
    
    return inner            #返回inner函数, 给index重新赋值.

@timmer         #语法糖,等同于 index=timmer(index)  , 把index原函数作为形参传递给timmer函数func
def index(args):        # 原函数具有传参的功能
    time.sleep(2)
    print(f'welcome args')
    return True         # 原函数具有返回值的功能

index('都来看')            # 执行的是inner函数,把参数传递给inner函数,






####装饰器:
    #1.必须存在嵌套函数中
    #2.必须存在内存函数对外层函数(非全局变量)的引用
    #3.必须具有return 返回嵌套函数的内存地址(嵌套函数名字)
    #4.内层函数必须能够接收原函数传递的参数
    #5.内存函数执行完必须返回原函数要返回的结果
    
####装饰器约束:
    #1.不得更改源码,
    #2.不能更改调用方式
    
####应用场景:
    #用户登录验证
     #打印日志

以上是关于Python进阶----装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python进阶第九篇装饰器

Python进阶-----类的装饰器及应用

Python进阶----装饰器

进阶Python:装饰器 全面详解

python之函数的进阶闭包装饰器

1Python进阶强化训练之装饰器使用技巧进阶