自己对装饰器理解(怎么百度排序排第一个)
##需求:在运行一个函数之前,先验证身份。
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)
貌似效果一样,但不知上面写具体作用为啥。
以上有问题多多包涵踢出来,本人新手一枚!!

