装饰器

装饰器 -面试必需品

  • 不想修改函数的调用方式,但是还想在原来函数前后添加功能
    • 装饰器实际运行模式的模拟
    import time
    
    #定义被装饰的函数
    def func():
        print('我测试函数的运行速度')
        
    #定义装饰器,必须是闭包
    def timer(f):
        def func():
            start = time.time()
            time.sleep(1)
            f()
            end = time.time()
            print(end - start)
        return func
    #调用
    func = timer(func)  
    func()  让其看起来像是直接调用的函数func达到测试时间的效果
    
  • 语法糖
    • 真正使用装饰器
    import time
    
    #定义装饰器
    def timer(f):
        def func():
            start = time.time()
            time.sleep(1)
            f()
            end = time.time()
            print(end - start
        return func
        
    @timer  #采用装饰器的效果
    def func():
        print('我测试函数的运行速度')
    #调用
    #func = timer(func)  这句话直接用 @装饰器名 代替
    func()  #采用装饰器后直接调用原函数就行
    

装饰器的形成过程

  • 最简单的>>有返回时的>>有一个参数的>>万能参数

装饰器的作用

原则:开放封闭原则

  • 开放
    • 对扩展是开放的,函数对外扩展是开放的
  • 封闭
    • 对修改是封闭的,函数一但定义并确认不能轻易的修改或者不修改

装饰器的固定模式

  • 装饰器实际是调用装饰器内部函数
#定义装饰器
def wrapper(f): #f是被装饰的函数
    def inner(*args, **kwargs): 
        '''执行被装饰的函数之前需要执行的'''
        ret = f(*args, **kwargs)
        '''执行被装饰的函数之后需要执行的'''
        return ret
    return inner
    
@wrapper  #调用装饰器
def func()  
    pass
#调用
func()  #实际上是调用inner()
原文地址:https://www.cnblogs.com/liliudong/p/9572742.html