Python-装饰器(之一)

一、装饰器的基本原理
装饰器:本质就是函数,功能是为其他函数添加附加功能。
原则:不修改被修饰函数的源代码
不修改修饰函数的调用方法论
装饰器=高阶函数+函数嵌套+闭包
二、高阶函数(满足不了装饰器的功能)
1、函数接收的参数是一个函数名
2、函数的返回值是一个函数名
3、满足上述条件任意某一个,都可以称之为高阶函数

# 1)	不能保证函数的调用方式不被修改
def foo():
	print('我爱可乐')
def test(func):
	#print(func)
	func()
test( foo)
# 2)
def foo():
	print('我爱可乐')
def test(func):
	return func
res = test(foo)
res() #我爱可乐
# 3)为foo增加新功能且不被改变点调用方式
import time
def foo():
	time.seep(3)
	print('我爱可乐')
def test(func):
	star.time = time.time()
	func()
	stop_tipme = time.time()
	print('函数的运行时间是%s'%(stop_time-star_time))
	return func
foo = test(foo)
foo() #我爱可乐
	  #函数的运行时间是 3.0001716613769
	  #我爱可乐

三、函数的嵌套

def foo(name):
	print('我最爱%s'%name)
	def test():
		print('她也喜欢%s'%name)
	test()
foo('可乐') #我最爱可乐
			#她也喜欢可乐

四、常函数闭包

def foo(name):
	def test():
		def test1():
			print('我也喜欢%s'%name)
		test1() #直接通过foo调用test1
	test()
foo('可乐') #我也喜欢可乐

5、装饰器
1)、框架

def timmer(func):
	def wrapper():
		print(func)
		func()
	return wrapper
	

2)、运用装饰器给函数增加功能

import time
def timmer(func):
	def wrapper():
		star.time = time.time()
		res=func()  #此时便可返回test中的返回值了
		stop_tipme = time.time()
		print('函数的运行时间是%s'%(stop_time-star_time))
		return res  #函数闭包上加返回值
	return wrapper
@timmer  #相当于test = timmer(test)
def test():
	time.sleep(3)
	print('函数运行完毕')
test() #函数运行完毕
	   #函数的运行时间是 3.0001714229
	   

七、函数闭包上加参数
补:解压序列:(1)a,b,c = (1,2,3) 以一对应a获取1,b获取2,c获取3
(2)l = [10,‘b’,12,11]
a,*,c = l # *代表中间所有元素,后面可以加任何变量
print(a) #10
print(
) #[‘b’,12]
print© #11
若两数交换可用简单方法:
a=1,b=2
a,b=b,a
print(a) #2
print(b) #1

import time
def timmer(func):
	def wrapper(*args,*kwargs):
		star.time = time.time()
		res=func(*args,*kwargs)  #此时便可返回test中的返回值了
		stop_tipme = time.time()
		print('函数的运行时间是%s'%(stop_time-star_time))
		return res  #函数闭包上加返回值
	return wrapper
@timmer  #相当于test = timmer(test)
def test(name,age):
	time.sleep(3)
	print('函数运行完毕')
	retuen '这是test的返回值'
@timmer  #相当于test = timmer(test)
def test1(name,age,alex):
	time.sleep(3)
	print('.....')
	return '3'
	

八、函数闭包为函数加上认证功能

def test_func(func):
	def wrapper(*args,*kwargs):
		username = input('输入用户名:').strip()
		passward = input('输入密码:').strip()
		if username == '可乐' and passward == '123':
			res=func(*args,*kwargs)
			return res
		else:
			print('用户名或密码错误')
	return wrapper
@test_func
def index():
	print('欢迎来到淘宝界面')
@test_func 
def shopping(name):
	print('欢迎%s回家'%name)
index() #用户名:可乐
		#密码:123
		#欢迎来到淘宝界面
shopping('主人') #用户名:可乐
				 #密码:123
				 #欢迎主人回家
	 

九、函数闭包参数模拟

user_dic = {'username':None,'login':False}  #用来判断用户的登录状态
list = [
		{'name':'alxe','passward''123':}
		{'name':'kele','passward''234':}
		{'name':'ooo','passward''345':}
		]
def timmer(func):
	def wrapper(*args,*kwargs):
		if user_dic['username'] and user['login']:
			res=func(*args,*kwargs)
			return res
		username = input('输入用户名:').strip()
		passward = input('输入密码:').strip()
		for user_list in dic
			if username == user_list['name'] and passward == user_list['passwaed']:
				user_dic['username'] == username
				user_dic['login'] == True
				res=func(*args,*kwargs)
				return res
		else:
			print('用户名或密码错误')
	return wrapper
@timmer
def index():
	print('欢迎来到淘宝界面')
@timmer 
def home(name):
	print('欢迎%s回家'%name)
index()
home('可乐')

十、带参数的装饰器

current_dic = {'username':None,'login':False}  #用来判断用户的登录状态
list = [
		{'name':'alxe','passward''123':}
		{'name':'kele','passward''234':}
		{'name':'ooo','passward''345':}
		]
def auth(auth_type = 'filedb')
	def auth_func(func):
		def wrapper(*args,*kwargs):
			print('认证类型是',auth_type)
			if auth_type=='filedb':
				if current_dic['username'] and current_dic['login']:
					res=func(*args,*kwargs)
					return res
				username = input('输入用户名:').strip()
				passward = input('输入密码:').strip()
				for user_list in list
					if username == user_list['name'] and passward == user_list['passwaed']:
						current_dic['username'] == username
						current_dic['login'] == True
						res=func(*args,*kwargs)
						return res
				else:
					print('用户名或密码错误')
			elif autn_type=='ldap'
				print('认证完毕')
			return wrapper
		return auth_func
		
	@auth(auth_type = 'filedb')
	def index():
		print('欢迎来到淘宝界面')
	@auth(auth_type = 'filedb')
	def home(name):
		print('欢迎%s回家'%name)
	index()
	home('可乐')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值