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:
相关文章推荐
- python简要
- Python 库大全
- 详解Python中re.sub
- 习题5 更多的变量和打印
- scrapy抓取csdn中标题带有“语义”关键字的文章的标题和链接
- Python.Lists
- python制作二维码
- Python实现Singleton模式
- Python 面向对象编程容易忽视的知识点
- Zen of Python
- [python]去掉 unicode 字符串前面的 u(转)
- 习题4 变量和命名
- Learning Python 001 第一个程序
- Learning Python 001 第一个程序
- consul python api
- 笨办法学python 40
- python部落习题笔记
- Python 学习笔记 ——装饰器
- python django 数据库查询方法总结
- 分析Python的Django框架的运行方式及处理流程