Python之旅.第三章.函数3.29

Posted yangli0504

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之旅.第三章.函数3.29相关的知识,希望对你有一定的参考价值。

一、无参装饰器

1 开放封闭原则
软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
也就是说我们必须找到一种解决方案:
能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能

总结,
原则如下:
1、不修改源代码
2、不修改调用方式
目的:
在遵循1和2原则的基础上扩展新功能

2、什么是装饰器?
器指的工具,装饰指的是为被装饰对象添加新功能

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

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

装饰器=》函数
被装饰的对象=》函数

‘‘‘

import time #调用时间方法

def index():
start_time=time.time() #设定开始时间
time.sleep(3) #暂停3秒
print(‘welcome to index page‘)
stop_time=time.time()  #设定结束时间
print(‘run time is %s‘ %(stop_time-start_time)) #开始时间减结束时间,等于用的时间

index()


#修订1:
import time

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

def home(name):
time.sleep(5)
print(‘welcome %s to home page‘ %name)

start_time=time.time()    #将时间操作单独拿出使用
index()
stop_time = time.time()
print(‘run time is %s‘ % (stop_time - start_time))

start_time=time.time()
home(‘egon‘)
stop_time = time.time()
print(‘run time is %s‘ % (stop_time - start_time))


#修订2:
import time

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

def home(name):
time.sleep(5)
print(‘welcome %s to home page‘ %name)

def wrapper(func): #func=index #把时间操作放到函数中
start_time=time.time()
func() #index()
stop_time = time.time()
print(‘run time is %s‘ % (stop_time - start_time))


wrapper(index) # 修改了原函数的调用方式



#修订3:
import time

def index(): #原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 #将返回值wrapper赋予index

index() #wrapper() #等于weapper函数

二、无参装饰器升级版

import time

def index():
time.sleep(1)
print(‘welcome to index page‘)
return 122

def home(name):
time.sleep(2)
print(‘welcome %s to home page‘ %name)

#==============装饰器
def timmer(func): #外包
#func=最原始的home
def wrapper(*args,**kwargs): #嵌套函数,赋予形参*args,**kwargs,用于解决调用函数自带参数问题
start_time=time.time()
res=func(*args,**kwargs) #调用最原始的home,将值赋予res留返回
stop_time=time.time()
print(stop_time-start_time)
return res #对应带返回值的函数处理
return wrapper


index=timmer(index) # 新的index=wrapper
home=timmer(home) #新的home=wrapper
# ==========================================

home(name=‘egon‘) #wrapper(‘egon‘)
index() #wrapper()


#无参装饰器模板
def outer(func):
def inner(*args,**kwargs):
res=func(*args,**kwargs)
return res
return inner

三、装饰器语法

关键字@,@后面跟装饰器函数名,正下面为需要用到装饰器的函数,@必须单独一行

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)

# index()
home(‘egon‘)

四、叠加多个装饰器

import time
current_user={ #字典用于存用户名
‘username‘:None,
# ‘login_time‘:None
}

def auth(func): #注册装饰器
# func=index
def wrapper(*args,**kwargs):
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(‘用户名或密码错误‘)
return wrapper

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 # timmer 统计的是auth+index的执行时间
@auth
def index():
time.sleep(1)
print(‘welcome to index page‘)
return 122

index()

两种装饰器叠加使用(红字),timmer为下只统计index的运行时间,放上面统计的是auth+index的执行时间

五、有参数装饰器

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 #返回值为auth2
#用法 @第三层函数名加参数,因为执行到这段代码会运行,返回值为auth2,也就等于执行的是@auth2,成功赋值index
@auth(‘ldap‘) #@auth2 #index=auth2(index) #index=wrapper
def index():
time.sleep(1)
print(‘welcome to index page‘)
return 122

index() # wrapper()




















































































































































































































































以上是关于Python之旅.第三章.函数3.29的主要内容,如果未能解决你的问题,请参考以下文章

Python之旅.第三章.函数3.28

Python之旅.第三章.函数4.04

Python之旅.第三章.函数3.30

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Python学习之旅 —— 基础篇模

python之旅:函数