zoukankan      html  css  js  c++  java
  • Python3至装饰器,高阶函数,嵌套函数

    # Author:Allister.Liu
    # !/usr/bin/env python
    
    import time
    
    
    """
        装饰器:本质是函数(装饰其它函数),就是为其它函数添加附加功能。
        
        原则:
            1、不能修改被装饰的函数的源代码;
            2、不能修改被装饰的函数的调用方式
            
            
        实现装饰器只是储备:
            1、函数即“变量”;
            2、高阶函数;
                a、把一个函数名当做实参传递给另一个函数(再不修改源代码的同时,为其它函数附加新功能)
                b、返回值中包含函数名(不修改函数的调用方式)
            3、嵌套函数。
            
        高阶函数 + 嵌套函数 ==》 装饰器
    """
    
    
    
    # def start():
    #     print("in the start...")
    #
    # def test(func):
    #     start_time = time.time()
    #     func()
    #     stop_time = time.time()
    #     print("the func run time is %5f s" % (stop_time - start_time))
    
    
    # start()
    """
        装饰器举例:test函数中,func(可以是一个函数名《函数名对应的是内存地址》)参数被传入函数start,即 test = func = start,其中func()也就是调用被传入的参数func即start()
        所以,test()调用了start()的同时,也附加了打印执行时间的功能。
    """
    # test(start)
    
    
    
    """
    
    def timmer(func):
        def warpper():
            start_time = time.time()
            func()
            stop_time = time.time()
            print("the func run time is %4f 秒" % (stop_time - start_time))
        return warpper
    
    
    def test01():
        time.sleep(2)
        print("in the test01")
    
    test01 = timmer(test01)
    test01()
        第一种:
    """
    
    
    
    
    
    
    """
    第二种:
    
        @timmer : 等于 test01 = timmer(test01)        test01() = timmer()
    
    
    def timmer(func):
        def warpper():
            start_time = time.time()
            func()
            stop_time = time.time()
            print("the func run time is %4f 秒" % (stop_time - start_time))
        return warpper
    
    @timmer
    def test01():
        time.sleep(2)
        print("in the test01")
    
    test01()
    
    """
    
    
    
    
    """
     最终版:适用于所有方法,有参数无参数都可以
    """
    def timmer(func):
        def warpper(*args, **kwargs):
            start_time = time.time()
            func(*args, **kwargs)
            stop_time = time.time()
            print("the func run time is %4f 秒" % (stop_time - start_time))
        return warpper
    
    @timmer
    def test01():
        time.sleep(2)
        print("in the test01")
    
    test01()
    

      

    # Author:Allister.Liu
    # !/usr/bin/env python
    # -*- coding:utf-8-*-
    
    """
    需求:使用装饰器实现登录页面的验证
        公司网站:每一个页面当做一个函数,其中主页(index)不需要登录,其余页面都需要登录后才能访问
    
    
    
    user, pwd = "Allister", "123456"
    
    # 装饰器实现登录验证
    def auth(func):
        def wrapper(*args, **kwargs):
            username = input("UserName:").strip()
            password = input("Password:").strip()
    
            if username == user and pwd == password:
                print("user logined sucess!")
                return func(*args, **kwargs)
            else:
                exit("Invalid username or password ")
        return wrapper
    
    
    
    # 无需登录
    def index():
        print("welcome to index page")
    
    # 需登录
    @auth
    def manage():
        print("welcome to manage page")
    
    # 需登录
    @auth
    def bbs():
        print("welcome to bbs page")
    
    
    index()
    manage()
    bbs()
    
    """
    
    
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    
    """
        需求优化:manage使用local验证,bbs使用ldap验证
    """
    
    user, pwd = "Allister", "123456"
    
    # 装饰器实现登录验证
    def auth(auth_type):
        def auth_status(func): #manage at 0x000000000413DD08
            def wrapper(*args, **kwargs):
                if auth_type == "local":
                    username = input("UserName:").strip()
                    password = input("Password:").strip()
    
                    if username == user and pwd == password:
                        print("user logined sucess!")
                        return func(*args, **kwargs)
                    else:
                        exit("Invalid username or password ")
                elif auth_type == "ldap":
                    print("ldap验证登录...")
            return wrapper
        return auth_status
    
    
    
    # 无需登录
    def index():
        print("welcome to index page")
    
    # 需登录
    @auth(auth_type="local")        # manage = auth(auth_type="local") :auth_status门牌,也就是manage=auth_status(manage), wrapper门牌
    def manage():
        print("welcome to manage page")
    
    # 需登录
    @auth(auth_type="ldap")
    def bbs():
        print("welcome to bbs page")
    
    
    # index()
    manage()
    # bbs()
    

      

    # Author:Allister.Liu
    
    
    
    def decorator(func):
        print("decorator")
        def wrapper(*args, **kwargs):
            print("wrapper")
            func()
        return wrapper
    
    
    @decorator
    def test():
        print("the test function")
    
    
    test()
    

      

  • 相关阅读:
    软件工程实践个人编程作业
    实验 2:Mininet 实验——拓扑的命令脚本生成
    软工实践个人总结
    第08组 每周小结 (3/3)
    第08组 每周小结 (2/3)
    第08组 每周小结 (1/3)
    第08组 Beta冲刺 总结
    第08组 Beta冲刺 (5/5)
    第08组 Beta冲刺 (4/5)
    第08组 Beta冲刺 (3/5)
  • 原文地址:https://www.cnblogs.com/allister/p/8303707.html
Copyright © 2011-2022 走看看