码迷,mamicode.com
首页 > 编程语言 > 详细

python 之 函数 装饰器

时间:2019-06-11 22:08:23      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:成功   新功能   函数   一个   扩展   原则   ring   port   inner   

5.8 装饰器

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

装饰器: 装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能,装饰器与被装饰的对象均可以是任意可调用的对象

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

5.81 无参装饰器举例

import time
def index():
   time.sleep(3)
   print(‘welcome to index page‘)
def outter(func): #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()
welcome to index page
3.0000429153442383

5.82 无参装饰器升级

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=最原始的index
   def wrapper(*args,**kwargs):
       start_time=time.time()
       res=func(*args,**kwargs) #调用最原始的index
       stop_time=time.time()
       print(stop_time-start_time)
       return res
   return wrapper
?
index=timmer(index) # 新的index=wrapper
home=timmer(home) #新的home=wrapper
# ==========================================
?
res=index() #res=wrapper()
print(res)
res=home(name=‘egon‘) #res=wrapper(name=‘egon‘)
print(res)

5.83 无参装饰器模板:

def index():
   pass
#==============装饰器
def outer(func):
   def inner(*args,**kwargs):
       res=func(*args,**kwargs)
       return res
   return inner
?
index=outer(index)
# ==========================================
res=index()
print(res)

使用:在被装饰对象正上方单独一行,@无参装饰器名

@无参装饰器名
def foo():
   pass

5.84 装饰器语法糖

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‘)

5.85 叠加装饰器

import time
current_user={
   ‘username‘: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()

5.86 有参装饰器

import time
current_user={
   ‘username‘:None
}
def auth(engine): # engine=‘file‘ #添加一层函数传engine值
   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_src=auth(‘ldap‘)
#@auth_src
?
@auth(‘ldap‘) # @auth2 #index=auth2(index) #index=wrapper
def index():
   time.sleep(1)
   print(‘welcome to index page‘)
   return 122
?
index() # wrapper()

5.87 有参装饰器模板

def outter2(x,y,z):
   def outter(func):
       def wrapper(*args,**kwargs):
           res=func(*args,**kwargs)
           return res
       return wrapper
   return outter
@outer2(1,2,3)
# ==========================================
def index():
   pass
res=index()
print(res)

使用:在被装饰对象正上方单独一行,@有参装饰器名(1,2,3)

@有参装饰器名(1,2,3)
def foo():
   pass

python 之 函数 装饰器

标签:成功   新功能   函数   一个   扩展   原则   ring   port   inner   

原文地址:https://www.cnblogs.com/mylu/p/11006349.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!