zoukankan      html  css  js  c++  java
  • 装饰器函数

    1.装饰器
    ​ 装饰器:在不改变原函数的调用方式和函数,额外的增加功能
    简单装饰器
    
    def timer(func):
        def inner():
            print(time.time())
            func()   #  原来的函数
        return inner
    ​
    @timer  # func1 = timer(func1)
    def func1():
        print('func1')
    函数带返回值
    
    def timer(func):
        def inner():
            print(time.time())
            ret = func()  # 原来的函数
            return ret
        return inner
    原函数携带参数
    
    def download(func):
        def inner(*args, **kwargs):
            print('下载软件')
            func(*args, **kwargs)
        return inner
    完整的装饰器的写法
    
    def wrapper(func):
        def inner(*args, **kwargs):
            # 执行被装饰函数之前进行的操作
            ret = func(*args, **kwargs)
            # 执行被装饰函数之后进行的操作
            return ret
        return inner
    装饰器带参数
    
    def outer(flag):
        def timer(func):
            def inner(*args, **kwargs):
                if flag:
                    print(time.time())
                    ret = func(*args, **kwargs)  # 原来的函数
                else:
                    ret = func(*args, **kwargs)  # 原来的函数
                return ret
            return inner
        return timer
    ​
    @outer(True)  # func1 = timer(func1)  inner
    def func1():
        print('func1')
    多个装饰器装饰同一个函数
    
    def wrapper1(func):
        def inner(*args, **kwargs):
            print('wrapper1 前')  # 2
            ret = func(*args, **kwargs)
            print('wrapper1 后')  # 4
            return ret
        return inner
    ​
    def wrapper2(func):
        def inner(*args, **kwargs):
            print('wrapper2 前')  # 1
            ret = func(*args, **kwargs)
            print('wrapper2 后')  # 5
            return ret
        return inner
    ​
    @wrapper2  # func1 = wrapper2(func1)  wrapper2.inner   func=wrapper1.inner
    @wrapper1  # func1 = wrapper1(func1)  wrapper1.inner   func=func1
    def func1():
        print('func1')  # 3
        return 'func1的返回值'
    ​
    print(func1())  # 6

     
    
    
    装饰器修复技术
    
    from functools import wraps
    def timer(func):
        @wraps(func)
        def inner():
            print(time.time())
            ret = func()  # 原来的函数
            return ret
        return inner
    

      

  • 相关阅读:
    2.Mysql集群------Mycat读写分离
    ASP.NET Core 认证与授权[4]:JwtBearer认证
    API做翻页的两种思路
    C# 8
    ASP.NET Core 认证与授权[2]:Cookie认证
    ASP.NET Core 认证与授权[1]:初识认证
    Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截
    C#中out和ref的区别
    存储过程的优缺点
    存储过程的作用和意义,讲的很好
  • 原文地址:https://www.cnblogs.com/PythonMrChu/p/10067158.html
Copyright © 2011-2022 走看看