• 装饰器-2


    装饰器

    开发原则

    • 开放封闭原则

    装饰器的作用

    • 在不改变原函数的调用方式的情况下,在原函数前后增加功能

    装饰器的本质

    • 闭包函数

        #定义一个装饰器
        def wrapper(f):
        	def inner(*args, **kwargs):
        		ret = f(*args, **kwargs)
        		return ret
        	return inner
        	
        @wrapper	#装饰器的使用
        def func():
        		pass
        #调用函数
        func()
      

    functool.wraps

    • 内置装饰器,可以将修饰的函数各种功能还原

        from funtools import wraps
        def wrapper(func):
        	@wraps(func)
        	def inner(*args, **kwargs)
        		fet = func(*args, **kwargs)
        		return fet
        	return inner
      

    带参数的装饰器

    • 需要给装饰器再外套一层

    • 个人理解:装饰器就是跳过了第一层函数,直接进入第二层函数,但是最后一层函数必须是闭包

    • 500个函数案例解决方案

        	import time
        	flag = Ture	#定义一个判断参数
        	def timer_out(flag):
        		def timer(func):
        			def inner(*args, **kwargs)
        				if flag:
        					start = time.time()
        					ret = func(*args, **kwargs)
        					end = time.time()
        					print(end - start)
        					return ret
        				else:
        					ret = func(*args, **kwargs)
        					return ret
        			return inner
        		return timer
        		
        	#timer = time_out(flag)
        	@timer_out(flag)	#给装饰器一个参数的时候,装饰器函数要再外套一层
        	def func():
        		pass
      

    多个装饰器装饰一个函数

    • 多个装饰器就是装饰器的套用

    • 多个装饰器执行顺序是从下到上

    • 多个装饰器先执行距离 被装饰的函数 近的装饰器

        #定义装饰器1
        def wrapper1(f):
        	def inner1(*args, **kwargs):
        		print('wrapper1, before f')
        		ret = f(*args, **kwargs)
        		print('wrapper2, after f')
        		return ret
        	return inner1
        	
        #定义装饰器2
        def wrapper2(f):
        	def inner2(*args, **kwargs)
        		print('wrapper2, before f')
        		ret = f(*args, **kwargs)
        		print('wrapper2, after f')
        		return ret
        	return inner2
        
        #调用装饰器	
        @wrapper2	#func=wrapper(func) --> func=wrapper(warpper(func)) 调用inner2(inner1)
        @wrapper1	#func = wrapper(func) 调用inner1
        def func():
        	print('f')
        	pass
        
        #调用函数	
        func()
        #结果
        wrapper2, before f
        wrapper1, before f
        f
        wrapper1, after f
        wrapper2, after f
  • 相关阅读:
    IIS 禁止自动回收
    误删除系统帐户且SA被禁用,如何修复?单用户模式登录可解决。
    不到100行代码实现SHELL环境下图形化的IP设置功能
    2021总结
    快排
    Windows 10 修改用户名及Users文件夹
    DATUM支持不同格式(JSON,CSV,SQL,XML等)的在线模拟数据生成器
    记:云服务器被暴破感染bioset
    前端项目修改npm/yarn配置文件来加速包下载
    十个前端常见手写功能
  • 原文地址:https://www.cnblogs.com/liliudong/p/9572744.html
Copyright © 2020-2023  润新知