zoukankan      html  css  js  c++  java
  • 函数的有用信息 带参数的装饰器 多个装饰器装饰一个函数

    01,函数的有用信息。
    login.__name__ : 显示函数名
    login.__doc__ : 显示注释 内容
     
    # def login(username, password):
    #     """
    #     此函数需要用户名,密码两个参数,完成的是登录的功能。
    #     :return: True 登录成功。 False登录失败。
    #     """
    #     # print(login.__name__)
    #     # print(login.__doc__)
    #     print('登录成功...')
    #     return True
    #
    # 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: True 登录成功。 False登录失败。
        """
        a = 2
        c = 4
        print('登录成功...')
        return True
    
    print(login.__name__)
    print(login.__doc__)


    02,带参数的装饰器
    # import time
    #
    #
    # def timer_out(flag1):  #falg1 = flag
    #     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 = False
    #
    # @timer_out(flag)  # 1,步 timer_out(flag) == timer 2,@与timer结合,变成你熟悉的装饰器 @timer
    # def func1():
    #     print(111)
    #
    #
    # @timer_out(flag)
    # def func2():
    #     print(222)
    #
    #
    # @timer_out(flag)
    # def func3():
    #     print(333)
    #
    # func1()
    # func2()
    # func3()
    
    
    
     
    # 局部只能引用全局的变量,不能修改,如果要修改,global。
    
    
    # 子函数只能引用父函数的变量,不能修改,如果要修改,nonlocal。


    03,多个装饰器装饰一个函数。
    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 func')  # 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()
    输出结果为:
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
     
  • 相关阅读:
    Java多线程之等待唤醒机制
    Java多线程之线程间的通信
    Java多线程之八锁问题
    Java多线程之基础
    el-table的动态合并行和列
    服务器、IP地址和域名之间有什么关系?
    node学习ing
    swipper的轮播图
    swipper内的部分区域的滚动(overflow: auto)与整个屏幕滚动冲突
    vue项目中引入 html2canvas ,控制台报错 Cannot assign to read only property 'className' of object '#< SVGSVGElement >'
  • 原文地址:https://www.cnblogs.com/HoneyTYX/p/9041672.html
Copyright © 2011-2022 走看看