• 023_decorater


    #!/usr/bin/env python
    # Author:liujun

    # The essence of decorator is function which is used to decorate another function.
    # The decorator is used to add some additional ability to a function.
    # The principle of defining a decorator
    # You can not modify the source code of the function to be decorated
    # You can not change the way calling the function to be decorated


    # Functions are alse variables
    # Higher-order functions
    # Pass a function as a parameter to another function
    # The function name is included in the return value


    # The following code implements adding a functionality to the function,
    # but it's not a decorator,because it doesn't satisfy the other condition
    import time
    def func():
    time.sleep(1)
    print("in the func")
    def decorator(func):
    start_time = time.time()
    func()
    end_time = time.time()
    print("the func run time is %s"%(end_time - start_time))
    #decorator(func)




    # The following code implements adding functionalty to a function without changing the way to call it
    def bar():
    time.sleep(1)
    print("in the bar")

    def decorator2(func):
    print(func)
    return func # Just return the address of func

    bar = decorator2(bar)
    #bar()




    # Embeded function
    def foo():
    print("in the foo")
    def bar(): # This is a local variable
    print("in the bar")
    bar()
    foo()





    # Decoretor version 1
    # We do not modify the source code and we add the new func to it.
    # But we changed the way to call it
    def decorator1(func):
    start_time = time.time()
    func()
    end_time = time.time()
    print("the func run time is %s" % (end_time - start_time))

    def test1_1():
    time.sleep(1)
    print("in the test1_1")

    def test1_2():
    time.sleep(1)
    print("in the test1_2")
    decorator1(test1_1)
    decorator1(test1_2)



    # Decoretor version 2
    # We do not modify the source code and not change the way to call it
    # But we do not add new func to it
    def decorator2(func):
    start_time = time.time()
    return func
    end_time = time.time()
    print("the func run time is %s" % (end_time - start_time))

    def test2_1():
    time.sleep(1)
    print("in the test2_1")

    def test2_2():
    time.sleep(1)
    print("in the test2_2")
    test2_1 = decorator2(test2_1)
    test2_2 = decorator2(test2_2)
    test2_1()
    test2_2()




    # Decoretor version 3 : higher-order function + Embed function
    def timer(func):
    def deco():
    start_time = time.time()
    func()
    end_time = time.time()
    print("the func run time is %s" % (end_time - start_time))
    return deco
    def test3_1():
    time.sleep(1)
    print("in the test3_1")

    def test3_2():
    time.sleep(1)
    print("in the test3_2")

    test3_1 = timer(test3_1)
    test3_2 = timer(test3_2)
    test3_1()
    test3_2()


    # Decoretor version 4 : higher-order function + Embed function + @decoretor
    def timer2(func):
    def deco():
    start_time = time.time()
    func()
    end_time = time.time()
    print("the func run time is %s" % (end_time - start_time))
    return deco

    @timer2 # @timer2 is identical to test4-1 = timer(test4-1)
    def test4_1():
    time.sleep(1)
    print("in the test4_1")

    @timer2 # @timer2 is identical to test4-2 = timer(test4-2)
    def test4_2():
    time.sleep(1)
    print("in the test4_2")
    test4_1()
    test4_2()



    # Decoretor version 4 : higher-order function + Embed function + @decoretor + parameters
    def timer3(func):
    def deco(*args,**kwargs):
    start_time = time.time()
    func(*args,**kwargs)
    end_time = time.time()
    print("the func run time is %s" % (end_time - start_time))
    return deco

    @timer3
    def test5_1():
    time.sleep(1)
    print("in the test5_1")

    @timer3 # @timer2 is identical to test4-2 = timer(test4-2)
    def test5_2(name,age):
    time.sleep(1)
    print("in the %s : %s"%(name,age))

    test5_1()
    test5_2("liujun",28)






    #!/usr/bin/env python
    # Author:liujun

    user = "liujun"
    passwd = "123456"

    '''
    #version 1
    def auth(func):
    def inDecoretor(*args,**kwargs):
    username = input("username:")
    password = input("password:")
    func(*args,**kwargs)
    return inDecoretor

    @auth
    def home():
    print("this is home")
    #return "from home"

    @auth
    def bbs():
    print("this is bbs")

    '''


    #version 2
    def auth(autoType):
    def outDecoretor(func):
    def inDecoretor(*args, **kwargs):
    username = input("username:")
    password = input("password:")
    res = "none"
    if autoType=="home":
    if user == username and passwd == password:
    res = func(*args, **kwargs)
    else:
    print("your name or password are wrong")
    else:
    print("bbs can not be allowed here")
    return res
    return inDecoretor
    return outDecoretor

    @auth("home")
    def home():
    print("this is home")
    return "from home"

    @auth("bbs")
    def bbs():
    print("this is bbs")

    print(home())
    bbs()
  • 相关阅读:
    GeoHash核心原理解析
    线程安全与可重入函数
    malloc和free的实现
    数字金字塔最大路径和——递归
    TCP连接建立与断开
    Gray Code
    C压缩字符串中的空格
    C++链接与装载
    epoll测试实例
    C++之手写strlen函数
  • 原文地址:https://www.cnblogs.com/liujun5319/p/9612609.html
Copyright © 2020-2023  润新知