zoukankan      html  css  js  c++  java
  • python笔记

                   python笔记 - day4-之装饰器                    

    需求:
    给f1~f100增加个log:
    def outer():                #定义增加的log
        print("log")  
    
    
    def f1():
        outer()                   #分别调用函数
        print("F1")
    
    def f2():
        outer()                   #分别调用函数
        print("F2")
    
    def f100():
        outer()                   #分别调用函数
        print("F100")
    
    f1()
    f2()
    f100()
    
    使用装饰器,增加log:
    def outer(func):
        def inner():
            print("log")
            return func()
        return inner
    
    @outer
    def f1():
        print("F1")
    
    @outer
    def f2():
        print("F2")
    
    @outer
    def f100():
        print("F100")
    
    f1()
    f2()
    
    并增加after:
    def outer(func):
        def inner():
            print('log')
            ret = func()
            print("after")
            return ret
        return inner
    
    @outer
    def f1():
        print("F1")
    
    @outer
    def f2():
        print("F2")
    
    @outer
    def f100():
        print("F100")
    
    f1()
    f2()
    
    

    装饰器流程剖析:

    声明:
    【函数的整体是可以被其他函数当做参数所调用,传递的】
    def f1():
        print('123')
    
    def f2(xxx):
        xxx()
    f2(f1)
    
    结果:123
    
    
    流程剖析,例一:
    def outer(func):
        print(123,func)
    
    @outer
    def f1():
        print('F1')
    
    Readme:
    1.执行程序后,会把123,重新赋值给f1,并且把老的,加载到内存的f1“print('F1')”,当做参数,当做参数,传给func;
    2.print(123,func),func,就是老的f1,通过传给func打印出来;
    
    流程剖析,例二:
    def outer(func): def inner(): print('before') #赋值给下面的f1 func() #调用执行老的f1 print('after') return inner #把结果返回给下面f1,并赋值给下面的f1;(注意:这里加括号,就是执行函数;不加括号,就是把inner函数体所有内容返回给f1,并重新赋值给f1) @outer def f1(): print('F1') f1() Readme: * 定义了两个函数,没有调用函数,不会执行; 功能一: 加上@outer,(@ + 函数名)后实现的效果: 自动执行outer函数,并且将其下面的函数名f1当作参数传递; 功能二: 将outer函数的返回值,重新赋值给f1;

    装饰器,返回值:
    def outer(func):
    def inner():
    print('before')
    r = func() #为什么不把这里直接写成return func(),因为这里这样写的话就会直接返回结果,下面的代码就不会执行了
    print('after')
    return r
    return inner

    @outer
    def f1():
    print('F1')
    return "砍你"

    ret = f1()
    print("返回值:",ret)

    装饰器,参数:

    def outer(func):
    def inner(arg): #这里加参数arg是因为执行程序后会把inner重新赋值给f1,
    # 老f1有参数,所以也必须给inner加上参数;
    print("before")
    r = func(arg) #这里是执行的是老f1,老f1需要传入一个参数,
    #r = func(123) #所以在这里给他传入参数;
    print("after")
    return r
    return inner

    @outer
    def f1(arg):
    print(arg)
    return "砍你"

    res = f1('fffff')
    print(res)


    装饰器,接收多个参数:
    def outer(func):
    def inner(*args,**kwargs): #想要接收多个参数,改这里
    print('before')
    r = func(*args,**kwargs) #想要接收多个参数,改这里
    print('after')
    return r
    return inner

    @outer
    def f1(arg):
    print(arg)
    return "砍你"

    ret = f1('fafafa')
    print("返回值:",ret)


    @outer
    def f2(arg1,arg2):
    print("F2")

    f2('bbbbb','ccccc')
     
    
    

     装饰器之-应用示例

    验证用户登陆,不使用装饰器:
    #!/usr/bin/python env
    #_*_coding:utf-8 _*_
    LOGIN_USER = {"is_login":False}
    
    def changepwd():
        if LOGIN_USER['is_login']:
            print("welcom to %s login"%LOGIN_USER['current_user'])
        else:
            print("Please login.")
    
    def manger():
        if LOGIN_USER['is_login']:
            print("welcom to %s login"%LOGIN_USER['current_user'])
        else:
            print("Please login.")
    
    def login(user,pwd):
        if user == 'alex' and pwd == '123':
            LOGIN_USER['is_login'] = True
            LOGIN_USER['current_user'] = user
            manger()
    
    def main():
        while True:
            inp = input("1.manger 2.login")
            if inp == '1':
                manger()
            elif inp == '2':
                username = input("username:")
                passwd = input("password:")
                login(username,passwd)
    main()
    
    
    
    验证用户登陆,使用装饰器:
    #!/usr/bin/python env
    #_*_coding:utf-8 _*_
    LOGIN_USER = {"is_login":False}
    
    def outer(func):
        def inner(*args,**kwargs):
            if LOGIN_USER['is_login']:   #使用装饰器后,只有这个条件成立了,才会执行下面的函数
                r = func()         #只有上面条件成立了,才会执行func()这个函数
           return r else: print("Please login") return inner @outer def changepwd(): print("welcom to %s login"%LOGIN_USER['current_user']) @outer def manger(): print("welcom to %s login"%LOGIN_USER['current_user']) def login(user,pwd): if user == 'alex' and pwd == '123': LOGIN_USER['is_login'] = True LOGIN_USER['current_user'] = user manger() def main(): while True: inp = input("1.manger 2.login") if inp == '1': manger() elif inp == '2': username = input("username:") passwd = input("password:") login(username,passwd) main()

    装饰器-之执行流程图:

    示例2:

    示例3:

  • 相关阅读:
    Part 7 Joins in sql server
    Part 9 Union and union all in sql server
    Part 4 using entity framework
    Part 3 ViewData and ViewBag in mvc
    Part 2 How are the URL's mapped to Controller Action Methods?
    Part 1 some difference from asp.net to asp.net mvc4
    Part 18 Indexes in sql server
    c/c++保存日志程序模板
    技术只是工具,你不能用它来代替生活
    网络篇:linux下select、poll、epoll之间的区别总结
  • 原文地址:https://www.cnblogs.com/tangshengwei/p/5671124.html
Copyright © 2011-2022 走看看