##需求:在运行一个函数之前,先验证身份。

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')

最原始的代码流程,也是最low的写法,但是效果达到了:
自己对装饰器理解(怎么百度排序排第一个) 随笔 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

自己对装饰器理解(怎么百度排序排第一个) 随笔 第2张

到此功能实现。

为啥还要写后续的呢?

 =========================================================================================

如果在其它地方运行函数的时候也要验证身份,岂不是还要写一遍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)

貌似效果一样,但不知上面写具体作用为啥。

 以上有问题多多包涵踢出来,本人新手一枚!!

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄