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()
装饰器-之执行流程图:
![](https://images2015.cnblogs.com/blog/779593/201607/779593-20160715185237061-944377350.png)
示例2:
![](https://images2015.cnblogs.com/blog/779593/201607/779593-20160715185255186-282147500.png)
示例3:
![](https://images2015.cnblogs.com/blog/779593/201607/779593-20160715185306420-42866047.png)