自己对装饰器理解(怎么百度排序排第一个)
##需求:在运行一个函数之前,先验证身份。
import time #定义一个想要运行的函数 def home(name): time.sleep(0.8) print('welcome to %s home page'%name) #定义一个身份认证 username=input('login: ').strip() password=input('password: ').strip() if username == 'zhifeng' and password == 'redhat': print('login success') home('zhifeng') #身份通过,运行home()函数 else: print('error')SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
到此功能实现。
为啥还要写后续的呢?
=========================================================================================
如果在其它地方运行函数的时候也要验证身份,岂不是还要写一遍username and password 等等。。。。
为此优化源代码,实现在不同地方,验证身份
import time def home(name): time.sleep(0.8) print('welcome to %s home page'%name) def wrapper(func): # 为方便身份验证 执行调用,将功能设置为函数,同时接受传参 username=input('login: ').strip() password=input('password: ').strip() if username == 'zhifeng' and password == 'redhat': print('login success') func('zhifeng') else: print('error') wrapper(home) # 更改了对原始函数的调用方式
=====================================================================================================
如果,就是有那么多如果
如果还有一个用户,登陆的zhifeng1 ,显示的是zhifeng1的home page,那么更改验证,使得可以传入参数给home(name)函数
import time def home(name): time.sleep(0.8) print('welcome to %s home page'%name) func=home def wrapper(*args,**kwargs): username=input('login: ').strip() password=input('password: ').strip() if username == 'zhifeng' and password == 'redhat': print('login success') res=func(*args,**kwargs) return res else: print('error') wrapper('zhifeng') wrapper('zhifeng1')
???这边有点乱,但是功能可以出来,需求我在想想
================================================================================================
如果又来了
如果还有其它函数,在运行之前也要身份验证,这就需要将被装饰的函数当成参数传进去,满足不同函数的身份验证
import time def home(name): time.sleep(0.8) print('welcome to %s home page'%name) def auth(func): def wrapper(*args,**kwargs): username=input('login: ').strip() password=input('password: ').strip() if username == 'zhifeng' and password == 'redhat': print('login success') res=func(*args,**kwargs) return res else: print('error') return wrapper home=auth(home) home('zhifeng') #调用方式没变,但已经不是原始home()函数
换种方式写 @auth
import time def auth(func): def wrapper(*args,**kwargs): username=input('login: ').strip() password=input('password: ').strip() if username == 'zhifeng' and password == 'redhat': print('login success') res=func(*args,**kwargs) return res else: print('error') return wrapper @auth def home(name): time.sleep(0.8) print('welcome to %s home page'%name) home('zhifeng')
到此,装饰器写完,被装饰函数被更改源代码,调用方式没变。
如果还有其它函数要身份验证,只需要在函数正上方@auth,做到装饰函数写完,按需调用
============================================================================
以上就是自己学习过程中小的总结,但是中间还有一些卡顿,没完全搞懂。
比如:
res=func(*args,**kwargs)
return res
如果直接写
func(*args,**kwargs)
貌似效果一样,但不知上面写具体作用为啥。
以上有问题多多包涵踢出来,本人新手一枚!!
