zoukankan      html  css  js  c++  java
  • 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.不能更改调用方式
        
    ####应用场景:
    	#用户登录验证
         #打印日志
    
  • 相关阅读:
    spring mvc处理json
    Unable to read TLD "META-INF/c.tld"错误
    linux设置tomcat开机自动启动
    linux tomcat自启动设置
    向PE文件植入后门代码技术讨论
    对自助提卡系统EDLM的一次代码审计
    XE下显示托盘图标(TrayIcon)
    delphi 查看编译版本
    Context Menus
    API Monitor---------------Using API Monitor to crack copy protected software
  • 原文地址:https://www.cnblogs.com/dengz/p/11077606.html
Copyright © 2011-2022 走看看