python笔记 - day4-之装饰器

               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:

posted @ 2016-07-14 17:29  唐胜伟  阅读(200)  评论(0编辑  收藏  举报