浩强的主页
世界上最幸福的事 莫过于为理想而奋斗

python 装饰器笔记

一,装饰器存在的需求。

   在已经开发好的函数功能,若需要给他加上新的功能。若改原函数,容易出现不可预料的bug,违反开放封闭原则。


二、装饰器的两个原则:1,不修改原函数的源代码。2,不修改该原函数的调用方式。


1、以下是比较常用到的案例。

import time
def zs_jisuanqi(func):
        #*a 接受不定参数放到元组中,通过解压序列赋值。#**b 接受关键字参数,放到字典中。
	def wrapper(*a,**b):
		start_time = time.time()
		v = func(*a,**b)
		stop_time = time.time()
		print(stop_time-start_time)
		return v
	return wrapper
#语法糖,放到函数定义的前面。相当于 jisuanqi = zs_jisuanqi(jisuanqi) 即wrapper赋值给了jisuanqi	
@zs_jisuanqi 
def jisuanqi(v):
	time.sleep(1)
	l = (i for i in range(v))
	return sum(l)
@zs_jisuanqi
def jiafa(a,b,c):
        time.sleep(1)
        return a+b+c
        
print(jisuanqi(10))


2、利用装饰器给已有函数添加认证功能。

user_list=[
	{'username':'test1','passwd':123},
	{'username':'test2','passwd':456},
	{'username':'test3','passwd':789},
	{'username':'test4','passwd':135},
	{'username':'test5','passwd':246},
	{'username':'test6','passwd':369}
]

current_list = {'username':None,'login':False}

def auth(func):
	def auth_login(*args,**kargs):		
		if current_list['username'] == user and current_list['login'] == True:
		      #注意此处为auth的参数名
			func(*args,**kargs) 
			return None
		passwd = int(input('请输入密码:').strip())
		for n in user_list:
			if n['username'] == user and n['passwd'] == passwd:
				func(*args,**kargs)
				current_list['username'] = user
				current_list['login'] = True
				print(current_list)
				break
		#for 循环非正常退出执行else语句
		else:
			print('用户名或者密码错误')
	return auth_login
@auth
def index(name):
	print('%s登录成功!' %(name))
@auth
def article(name):
	print('%s您可以写文章了' %(name))

user = input('请输入用户名:').strip()
index(user)
article(user)

image.png

上一篇
python 字符串方法笔记
下一篇
python time模块笔记

关于本站

好记性不如烂笔头