zoukankan      html  css  js  c++  java
  • 装饰器基本原理

    #coding=utf-8
    #装饰器本质为函数(用来装饰其他函数)为其他函数添加附加功能
    #原则:1、不能修改被装饰函数的源代码
    #2、不能修改函数的调用方式
    #实现装饰器
    #1、函数即变量
    #2、高阶函数
    #a、把一个函数名当做实参传入另一个函数
    #b、返回值中包含函数名(不修改函数的调用方式)
    #3、嵌套函数
    #高阶函数+嵌套函数 = 装饰器
    
    import time
    #装饰器实例
    # def timmer(func):
    #     def warpper(*args,**kwargs):
    #         start_time = time.time()
    #         func()
    #         stop_time = time.time()
    #         print ("the funtion run time is %s"%(stop_time-start_time))
    #     return warpper
    # @timmer
    # def fun1():
    #     time.sleep(3)
    #     print ("123456")
    #
    # fun1()
    #
    # def fun2():
    #     print ("this is fun2")
    #     fun3()
    
    #匿名函数
    # a = lambda x:x*3
    # print a(3)
    
    #高阶函数实例
    
    # def fun1():
    #     print ("123")
    #
    # def fun2(def1):
    #     start_time = time.time()
    #     time.sleep(3)
    #     def1()
    #     end_time = time.time()
    #     print("fun run time is %s"%(start_time-end_time))
    #
    #
    # fun2(fun1)   #调用fun1的一种方法加装饰的
    
    # def fun3():
    #     print ("456")
    #
    # def fun4(def1):
    #     print time.time()
    #     return def1
    #
    # x=fun4(fun3)
    # x()
    #
    # fun3 = fun4(fun3)
    # fun3()
    
    #嵌套函数实例
    
    # def fun5():
    #     print ("this is fun 5")
    #     def fun6():
    #         print ("this is fun 6")
    #     fun6()
    #
    # fun5()
    
    def fun7():
        time.sleep(4)
        print ("this is fun7")
    
    def fun8():
        time.sleep(6)
        print ("this is fun 8")
    
    def deco(funname):                                     #只用到了高阶函数的第一个特性 把一个函数名当做实参传入另一个函数
        start_time = time.time()
        funname()
        end_time = time.time()
        print ("run time is %s"%(start_time-end_time))
    
    # deco(fun7)                                           #此处给函数添加了新功能,但是调用方式变了
    # deco(fun8)
    
    def deco(funname):                                     #只用到了高阶函数的第二个特性 返回值中包含函数名(不修改函数的调用方式)可以实现不更改函数的调用方式
        start_time = time.time()
        return funname
        end_time = time.time()
        print ("run time is %s"%(start_time-end_time))
    #
    # fun7 = deco(fun7)
    # fun7()                                               #此处调用方式没变但是没加入新功能
    # fun8 = deco(fun8)
    # fun8()
    
    #接下来介入嵌套函数
    # def fun9():
    #     def fun10():
    #         """
    #         pass
    #         :return:
    #         """
    #即
    def fun9(funname):
        def fun10():
            start_time = time.time()
            funname()
            end_time = time.time()
            print ("run time is %s" % (start_time - end_time))
        return fun10
    
    # fun7 = fun9(fun7)
    # fun7()
    #相当于
    # @fun9
    #  def fun7():
    #         psss
    @fun9    #这一步进行的操作就是执行fun7 = fun9(fun7),而不会重新定义下面这个函数了
    def fun7():
        time.sleep(4)
        print ("this is fun7")
    
    #fun7()  #事实上执行的是fun10函数
    
    @fun9
    def fun11(time):
        print ("123")
    #执行fun11,会报错
    #fun11(1234)
    #执行fun11相当于执行fun10所以可以在fun10上加参数
    def fun9(funname):
        def fun10(*args,**kwargs):
            start_time = time.time()
            funname()
            end_time = time.time()
            print ("run time is %s" % (start_time - end_time))
        return fun10
    
    user = "zte"
    passw = "zte"
    
    def ayth(arg1):
        print arg1
        def outweappen(funname):
            def wrapper(*args,**kwargs):
                username = raw_input("please input username: ").strip()
                password = raw_input("please in put password:").strip()
                if username ==user and passw == password:
                    print("welcome")
                    return funname(*args,**kwargs)
    
                else:
                    exit()
            return wrapper
        return outweappen
    
    
    @ayth
    def index():
        print ("one")
    
    @ayth
    def home():
        print ("two")
        return "1241"  #这里需要返回值,因此要在wrapper内加入return funname()
    
    @ayth(arg1="abc")     #如果加了参数的话,就要使用多层嵌套
    def blog():
        print ("thrree")
    blog()
    """
    @ayth(arg1="abc") 相当于blog = ayth((arg1="abc"))=outweappen()加了括号,相当于要执行outweappen函数,而此函数返回了wrapper
    blog() =  wrapper()
    
    """
    
  • 相关阅读:
    Go对比其他语言新特性2(函数、包、错误处理)
    计算机基础知识
    GO的下载和环境配置,Goland编译器的配置和初始化项目
    软件工程第五次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    软件工程结对第二次作业
    软件工程结对第一次作业
  • 原文地址:https://www.cnblogs.com/qiangayz/p/8542708.html
Copyright © 2011-2022 走看看