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()
    

      

  • 相关阅读:
    HDU 1102 Constructing Roads
    HDU 1285 确定比赛名次。
    最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
    HDU Jungle Roads 1301 最小生成树、
    并查集小结(转)
    HDU hdu 2094 产生冠军 拓扑排序 判定环
    模运算(转)
    拓扑排序(主要是确定环和加法) HDU 2647 Reward
    HDU 1372 Knight Moves 简单BFS
    用计算机模型浅析人与人之间沟通方式 (一)如何谈话
  • 原文地址:https://www.cnblogs.com/allister/p/8303707.html
Copyright © 2011-2022 走看看