• 装饰器函数的有用信息


    装饰器的有用信息
    三个引号一回车
    def login():
        """
    
        :return:
        """
    写入备注:
    def login(username,password):
        """
        此函数需要用户名,密码两个参数,完成的是登录的功能。
        :return: Ture登录成功。 False登录失败。
        """
        print('登录成功...')
        return True
    login(1,2)
    
    打印信息:
    def login(username,password):
        """
        此函数需要用户名,密码两个参数,完成的是登录的功能。
        :return: Ture登录成功。 False登录失败。
        """
        print('登录成功...')
        return True
    login(1,2)
    print(login.__name__)     #打印函数名
    print(login.__doc__)      #打印函数注释
    打印函数的有用信息:
    from functools import wraps
    def wrapper(f):
        @wraps(f)
        def inner(*args,**kwargs):
            '''执行函数之前的操作'''
            ret = f(*args,**kwargs)
            '''执行函数之后的操作'''
            return ret
        return inner
    @wrapper
    def login(username,password):
        '''
        此函数需要用户名,密码两个参数,完成的是登录的功能。
        :return: Ture登录成功。 False登录失败。
        '''
        print('登录成功..')
        return True
    print(login.__name__)
    print(login.__doc__)
    
    from functools import wraps
    View Code
    import time
    flag = True
    def timer(f):
        def inner(*args,**kwargs):
            if flag:
                star_time = time.time()
                time.sleep(0.3)
                ret = f(*args,**kwargs)
                end_time = time.time()
                print('执行效率%s'%(end_time-star_time))
                return ret
        return inner()
    @timer
    def func1():
        print(111)
    @timer
    def func2():
        print(222)
    @timer
    def func3():
        print(333)
    View Code
    面试题:(,报错原因)
    1,
    count = 1
    def func1()
        print(count)
    func1
    #局部作用域可以对全局作用域的变量进行引用。
    count = 1
    2,****
    count = 1
    函数内部如果有变量名与全局变量名相同且对此变量进行改变,
    python就会将你引用的那个变量视为局部定义的变量,但是局部没定义,
    则他会报错。
    def func1():
        count = count + 1
        print(count)
    func1()
    3,
    flag = True
    def func1():
        if flag:
            print(333)
        global flag
        flag = False
    func1()
    4,
    flag = True
    while flag:
        print(333)
        flag = False
        print(222)
    for if while 没有开辟临时空间。
    5,
    count = 1
    def func4():
        count = count + 1
        print(count)
    func4()   #局部只能引用全局的变量,不能修改,如果要修改global.
    结果会报错,因为赋值浅引用的全局变量count分不清是修改的还是引用的
    6,函数中如果使用global + 变量 必须是第一次使用这个变量。
    flag = True
    def func1():
        if flag:
            print(333)
        global flag
        flag = False
    func1()
    View Code
    带参数的装饰器:
    import time
    def timer_out(flag1):
        def timer(f):
            def inner(*args,**kwargs):
                if flag1:
                    start_time = time.time()
                    time.sleep(0.3)
                    ret = f(*args,**kwargs)
                    end_time = time.time()
                    print('执行效率%s'%(end_time-start_time))
                    return ret
                else:
                    ret = f(*args,**kwargs)
                    return ret
            return inner
        return timer
    flag = True
    @timer_out(flag)
    def func1():
        print(111)
    @timer_out(flag)
    def func2():
        print(222)
    @timer_out(flag)
    def func3():
        print(333)
    func1()
    func2()
    func3()
    View Code
    带参数装饰器默写:
    def outer(flag):
        def timer(func):
            def inner(*args,**kwargs):
                if flag:
                    print('''执行函数之前要做的''')
                re = func(*args,**kwargs)
                if flag:
                    print('''执行函数之后要做的''')
                return re
            return inner
        return timer
    
    @outer(False)
    def func():
        print(111)
    
    func()
    View Code
    多个装饰器装饰一个函数:
    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()  # inner1()
            print('wrapper2 ,after fmunc')  # 5
        return inner2
    @wrapper2  # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2
    @wrapper1  # f = wrapper1(f) 里面的f函数名  外面的f新变量=inner1
    def f():
        print('in f')  # 3
    
    f()  # inner2()
    View Code
    多个装饰器装饰一个函数默写
    def wrapper1(fn):
        def inner(*args,**kwargs):
            print('11执行目标函数之前的操作')
            ret = fn(*args,**kwargs)
            print('11执行目标函数之后的操作')
            return ret
        return inner
    def wrapper2(fn):
        def inner(*args,**kwargs):
            print('22执行目标函数之前的操作')
            ret = fn(*args,**kwargs)
            print('22执行目标函数之后的操作')
            return ret
        return inner
    @wrapper2  #用[ ]表示
    @wrapper1  #用( )表示
    def func():
        print('333')   #目标
    func()
    [ ( 目标 )] : 从左到右依次执行
    #####哪个装饰器在最上边,执行的时候就在最外边(谁在最上边,谁在最外边)
    22执行操作之前
    11执行操作之前
    333
    11执行操作之后
    22执行操作之后
    View Code
  • 相关阅读:
    Elasticsearch6.x和7.x版本常用插件汇总
    阿里巴巴JAVA开发规范学习笔记
    jQuery学习和知识点总结归纳
    MySQL常用维护命令和操作
    MySQL知识点系统总结
    HTML基础知识自学教程
    最值得拥有的免费Bootstrap后台管理模板
    强烈推荐优秀的Vue UI组件库
    再次学习Git版本控制工具
    Linux下Apache虚拟主机配置
  • 原文地址:https://www.cnblogs.com/ls13691357174/p/9108110.html
Copyright © 2020-2023  润新知