闭包函数:
1 内部函数
2 包含对外部作用域而非全局作用域的引用
闭包函数的特点:
自带作用域
延迟计算
#闭包函数定义 1 def timmer(func): 2 def inner(*args,**kwargs): 3 re = func(*args,**kwargs) 4 return re 5 return inner 6 7 index(): 8 print("hello") 9 10 index = timmer(index) #index == inner 11 index() #index()==inner()
装饰器
一:开放封闭原则,对扩展是开放的,对修改是封闭的
二:装饰器,装饰器本质可以任意可调用对象,被装饰的对象也可以是任意
可调用对象,
装饰器的功能是:
在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能
原则:
1.不修改源代码
2.不修改调用方法
目标:添加新功能
1 #装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字 2 import time 3 import random 4 #装饰器 5 def timmer(func): 6 def wrapper(): 7 start_time = time.time() #添加的计算时间功能 8 func() 9 stop_time=time.time() 10 print(‘run time is %s‘ %(stop_time-start_time)) 11 return wrapper 12 13 #被装饰函数 14 @timmer #index=timmer(index) #index == wrapper 15 def index(): #index()== wrapper() 16 time.sleep(random.randrange(1,5)) 17 print(‘welecome to index page‘) 18 19 @timmer #home=timmer(home) #home==wrapper 20 def home(): 21 time.sleep(random.randrange(1,3)) 22 print(‘welecome to HOME page‘) 23 24 index() #wrapper() 25 home() #wrapper()
有参装饰器
1 def deco(auth_type=‘file‘): 2 def auth(func): 3 def wrapper(*args,**kwargs): 4 if auth_type == ‘file‘: 5 print(‘文件的认证方式‘) 6 elif auth_type == ‘ldap‘: 7 print(‘ldap认证方式‘) 8 elif auth_type == ‘mysql‘: 9 print(‘mysql认证方式‘) 10 else: 11 print(‘不知到的认证方式‘) 12 return wrapper 13 return auth 14 15 @deco(auth_type=‘abc‘) #@auth #index=auth(index) 16 def index(): 17 print(‘welecome to index‘) 18 19 @deco(auth_type=‘ldap‘) 20 def home(name): 21 print(‘welecome %s to home page‘ %name) 22 23 index() 24 25 home(‘egon‘)
时间: 2024-10-11 04:16:49