您的位置:首页 > 编程语言 > Python开发

python笔记 - day4-之装饰器

2016-07-14 17:29 567 查看

  python笔记-day4-之装饰器

需求:
给f1~f100增加个log:
defouter():#定义增加的log
print("log")

deff1():
outer()#分别调用函数
print("F1")

deff2():
outer()#分别调用函数
print("F2")

deff100():
outer()#分别调用函数
print("F100")

f1()
f2()
f100()

使用装饰器,增加log:
defouter(func):
definner():
print("log")
returnfunc()
returninner

@outer
deff1():
print("F1")

@outer
deff2():
print("F2")

@outer
deff100():
print("F100")

f1()
f2()

并增加after:
defouter(func):
definner():
print('log')
ret=func()
print("after")
returnret
returninner

@outer
deff1():
print("F1")

@outer
deff2():
print("F2")

@outer
deff100():
print("F100")

f1()
f2()


装饰器流程剖析:

声明:
【函数的整体是可以被其他函数当做参数所调用,传递的】
deff1():
print('123')

deff2(xxx):
xxx()
f2(f1)

结果:123

流程剖析,例一:
defouter(func):
print(123,func)

@outer
deff1():
print('F1')

Readme:
1.执行程序后,会把123,重新赋值给f1,并且把老的,加载到内存的f1“print('F1')”,当做参数,当做参数,传给func;
2.print(123,func),func,就是老的f1,通过传给func打印出来;

流程剖析,例二:
defouter(func):
definner():
print('before')#赋值给下面的f1
func()#调用执行老的f1
print('after')
returninner#把结果返回给下面f1,并赋值给下面的f1;(注意:这里加括号,就是执行函数;不加括号,就是把inner函数体所有内容返回给f1,并重新赋值给f1)

@outer
deff1():
print('F1')

f1()

Readme:
*定义了两个函数,没有调用函数,不会执行;
功能一:
加上@outer,(@+函数名)后实现的效果:
自动执行outer函数,并且将其下面的函数名f1当作参数传递;
功能二:
将outer函数的返回值,重新赋值给f1;

装饰器,返回值:

defouter(func):
definner():
print('before')
r=func()#为什么不把这里直接写成returnfunc(),因为这里这样写的话就会直接返回结果,下面的代码就不会执行了
print('after')
returnr
returninner

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

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

装饰器,参数:

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

@outer
deff1(arg):
print(arg)
return"砍你"

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

装饰器,接收多个参数:

defouter(func):
definner(*args,**kwargs):#想要接收多个参数,改这里
print('before')
r=func(*args,**kwargs)#想要接收多个参数,改这里
print('after')
returnr
returninner

@outer
deff1(arg):
print(arg)
return"砍你"

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

@outer
deff2(arg1,arg2):
print("F2")

f2('bbbbb','ccccc')




装饰器之-应用示例

验证用户登陆,不使用装饰器:
#!/usr/bin/pythonenv
#_*_coding:utf-8_*_
LOGIN_USER={"is_login":False}

defchangepwd():
ifLOGIN_USER['is_login']:
print("welcomto%slogin"%LOGIN_USER['current_user'])
else:
print("Pleaselogin.")

defmanger():
ifLOGIN_USER['is_login']:
print("welcomto%slogin"%LOGIN_USER['current_user'])
else:
print("Pleaselogin.")

deflogin(user,pwd):
ifuser=='alex'andpwd=='123':
LOGIN_USER['is_login']=True
LOGIN_USER['current_user']=user
manger()

defmain():
whileTrue:
inp=input("1.manger2.login")
ifinp=='1':
manger()
elifinp=='2':
username=input("username:")
passwd=input("password:")
login(username,passwd)
main()

验证用户登陆,使用装饰器:
#!/usr/bin/pythonenv
#_*_coding:utf-8_*_
LOGIN_USER={"is_login":False}

defouter(func):
definner(*args,**kwargs):
ifLOGIN_USER['is_login']:#使用装饰器后,只有这个条件成立了,才会执行下面的函数
r=func()        #只有上面条件成立了,才会执行func()这个函数
       returnr
else:
print("Pleaselogin")
returninner

@outer
defchangepwd():
print("welcomto%slogin"%LOGIN_USER['current_user'])

@outer
defmanger():
print("welcomto%slogin"%LOGIN_USER['current_user'])

deflogin(user,pwd):
ifuser=='alex'andpwd=='123':
LOGIN_USER['is_login']=True
LOGIN_USER['current_user']=user
manger()

defmain():
whileTrue:
inp=input("1.manger2.login")
ifinp=='1':
manger()
elifinp=='2':
username=input("username:")
passwd=input("password:")
login(username,passwd)
main()


装饰器-之执行流程图:



示例2:



示例3:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: