zoukankan      html  css  js  c++  java
  • 4-2日装饰器,带参数的装饰器

    1,函数的有用信息

    from functools import wraps#引用模块
    def wrapper(f):  # f = func1
        @wraps(f)
        def inner(*args,**kwargs): #聚合
            #args (1,2,3)
            '''执行函数之前的相关操作'''
            ret = f(*args,**kwargs)  # 打散 1,2,3
            '''执行函数之后的相关操作'''
            return ret
        return inner

    2,装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

    def func1():
        """
        此函数是什么功能,参数分别是什么作用。
        :return: 返回值是登录成功与否(True,False)
        """
        print(999)
    
        return True
    
    func1()
    print(func1.__name__)
    print(func1.__doc__)
    def func1():
        """
        此函数是完成什么的功能,参数分别是。。。作用。
        :return: 返回值是登录成功与否(True,False)
        """
        print(666)
    
    
        print(func1.__name__)
        print(func1.__doc__)
        return True
    func1()

    3,装饰器带多个参数

    import time
    def timmer(*args,**kwargs):
        def wrapper(f):
            def inner(*args,**kwargs):
                if flag:
                    start_time = time.time()
                    ret = f(*args,**kwargs)
                    time.sleep(0.3)
                    end_time = time.time()
                    print('此函数的执行效率%f' % (end_time-start_time))
                else:
                    ret = f(*args, **kwargs)
                return ret
            return inner
        return wrapper
    
    flag = True
    @timmer(flag,2,3)  # 两步:1,timmer(flag) --> wrapper 2,@wrapper 装饰器
    def func1():
        print(666)
    
    
    @timmer(flag)
    def func2():
        print(777)
    func1()
    func2()

    4,多个装饰器装饰一个参数

    def wrapper1(func):  # func ==  f函数名
        def inner1():
            print('wrapper1 ,before func')  # 2
            func()
            print('wrapper1 ,after func')  # 4
        return inner1
    
    def wrapper2(func):  # func == inner1
        def inner2():
            print('wrapper2 ,before func')  # 1
            func()
            print('wrapper2 ,after func')  # 5
        return inner2
    # @wrapper3
    @wrapper2  #  f = wrapper2(f)  里面的f==inner1  外面的f == inner2
    @wrapper1  # f = wrapper1(f)   里面的f==函数名f  外面的f == inner1
    def f():  # 3
        print('in f')
    
    f()  # inner2()

    Python语言函数代码的执行流程,为了保证函数的定义先于其首次调用时执行,我们需要知道中语句的执行顺序。

    执行总是从程序的第一行代码开始的,从上到下,从左到右,按顺序依次执行第一条语句。

    函数定义并不会改变程序的执行流程,但应该注意函数代码块中的语句并不是立即就执行的,而是等到函数被程序调用时才会执行。

    函数调用可以看作程序执行流程中的一个迂回路径,遇到函数调用时,并不会直接继续执行下一条语句,而是跳到函数体的第一行,继续执行完函数代码块的所有语句,再跳回到原来离开的地方。

    看似比较简单,一会你会发现,函数代码块中可以调用其他函数,当程序流程运行到一个函数之中时,可能需要执行其他函数中的语句。但当执行那个函数中的语句时,又可能再需要调用执行另一个函数的语句。

    幸好Python对于它运行到哪里有很好的记录,所以在每个函数执行结束之后,程序都能跳回到它离开的那个地方,直到执行到整个程序的结尾,才会结束程序。

    当我们看别人的Python代码的时候,并不总是应该一行行的按照书写顺序来阅读,有时候,按照执行的流程来阅读代码,理解代码的含义才会更好一些。

  • 相关阅读:
    初识敏捷开发
    【C#】HTTP请求GET,POST(远程证书失效)
    登录验证的js;JS验证邮箱 验证密码
    字符串验证类
    ASP.NET获取客户端信息,获取客户端IP等等
    HttpCookie类
    js获取页面的来源页
    JS URL传中文参数引发的乱码问题
    SQL Server 2008删除或压缩数据库日志的方法
    数据库SQL优化大总结之 百万级数据库优化方案
  • 原文地址:https://www.cnblogs.com/yzxing/p/8692313.html
Copyright © 2011-2022 走看看