3/29 函数 装饰器

1 装饰器 

定义 开放封闭原则,软件一旦上线后,就应该遵循开放封闭的原则,即对修改源代码是封闭的,对功能的扩展是开放的。

也就是说我们必须找到一种解决方案:

能够在不修改原有代码的基础上,为其添加新功能。

  总结

原则如下:

1 .不修改源代码

2.不修改调用方式

目的:

在遵循1和2 原则的基础上扩展新功能。

 

2 什么是装饰器?

器指的是工具,装饰指的是为被装饰对象添加新功能

 

完整含义:

装饰器即在不修改被装饰对象代码与调用方式的前提下,为被装饰器对象添加新功能。

装饰器与被装饰的对象均可以是任意可调用的对象

装饰器=》函数

被装饰的对象=》函数

import time

第一种

def index()

  start_time=time.time()

  time.sleep(3)

  print('wclome,to index page')

  stop_time=time.time()

  print('run time is %s' %(stop_time-start_time))

第二种

index()

def index():

  time.sleep(3)

  print('xxxxxx')

def home (name):

  time.sleep(5)

  print('asdadas')

def wrapper(func): #func=index
start_time=time.time()
func() #index()
stop_time = time.time()
print('run time is %s' % (stop_time - start_time))
第三种
import time

def index():
time.sleep(3)
print('welcome to index page')

def outter(func): #func=最原始的index
# func=最原始的index
def wrapper():
start_time=time.time()
func()
stop_time=time.time()
print(stop_time-start_time)
return wrapper


index=outter(index) # 新的index=wrapper

index() #wrapper()

 

无参升级版


#==============装饰器
def timmer(func):
#func=最原始的home
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) #调用最原始的home
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper

装饰器语法糖
装饰器的正下方可以使用@来直接定义
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper

@timmer #index=timmer(index)
def index():
time.sleep(1)
print('welcome to index page')
return 122

@timmer # home=timmer(home)
def home(name):
time.sleep(2)
print('welcome %s to home page' %name)

有参数的装饰器

import time
current_user={
'username':None,
# 'login_time':None
}

def auth(engine):
# engine='file'
def auth2(func):
# func=index
def wrapper(*args,**kwargs):
if engine == 'file':
if current_user['username']:
print('已经登陆过了')
res=func(*args,**kwargs)
return res

uname=input('用户名>>: ').strip()
pwd=input('密码>>: ').strip()
if uname == 'egon' and pwd == '123':
print('登陆成功')
current_user['username']=uname
res=func(*args,**kwargs)
return res
else:
print('用户名或密码错误')
elif engine == 'mysql':
print('基于MyQL的认证')
elif engine == 'ldap':
print('基于LDAP的认证')
return wrapper
return auth2

@auth('ldap') #@auth2 #index=auth2(index) #index=wrapper
def index():
time.sleep(1)
print('welcome to index page')
return 122

 

 

 

  

posted @ 2018-03-29 15:33  书东  阅读(122)  评论(0编辑  收藏  举报