zoukankan      html  css  js  c++  java
  • 装饰器-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
  • 相关阅读:
    C# 创建一个日志文件
    C# WinForm程序添加引用后调用静态方法时报“Interfaces_Helper.Global”的类型初始值设定项引发异常。---> System.NullReferenceException: 未将对象引用设置到对象的实例。
    SqlServer 一些操作
    多线程处理sql server2008出现Transaction (Process ID) was deadlocked on lock resources with another process and has been chose问题
    SQL
    WinForm 弹框确认后执行
    C#强制清除缓存
    C#TextBox自动滚动到最低端
    XmlDocument To String
    ROCK 算法
  • 原文地址:https://www.cnblogs.com/liliudong/p/9572744.html
Copyright © 2011-2022 走看看