什么是装饰器?
器---->工具----->定义一个函数
装饰---->指的是为被装饰对象添加功能
装饰器本身就是任意可调用的对象---->函数
被装饰的对象也可以是任意可调用的对象---->函数
目标:写一个函数来为另一个函数添加新功能
为何要用装饰器?
开放封闭原则:软件一旦上线就应该对修改封闭,对扩展开放
对修改封闭:1,不能修改源代码
2,也不能修改功能的调用方法
扩展开放:可以为原有的功能添加新的功能
装饰器就是在不能改源代码以及调用方式的前提下为原功能添加新的功能。
3,如何装饰器?
无参装饰器
无参装饰器的模板:
import time
from functools import wraps
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
start = time.time()
res=func(*args,**kwargs)
stop = time.time()
print('run time is %s'%(stop-start))
return res
return wrapper
@outter
def index():
"""这是index功能"""
print('welcome to school ')
time.sleep(3)
return 123
@outter
def home(name):
"""这是home功能"""
print('welcome to %s home page'%name)
time.sleep(1)
# index()
# home('zrg')
print(help(index))
print(index.__name__)
装饰器的语法糖@
@装饰器名字
在被装饰对象正上方单独一行写上@装饰器的名字
# @装饰器的名字:要在被装饰对象正上方单独一行写上
import time
def timmer(func): # func=最原始那个home的内地址
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop-start))
return res
wrapper.__doc__=func.__doc__
wrapper.__name__=func.__name__
return wrapper
@timmer #index=timmer(index) ##index=timmer(最原始那个index的内地址) #index=wrapper函数的内地址
def index():
"""这是index功能"""
print('welcome to index page')
time.sleep(3)
return 123
@timmer #home=timmer(home) #index=timmer(最原始那个home的内地址) #home=wrapper函数的内地址
def home(name):
"""这是home功能"""
print('welcome %s to home page' %name)
time.sleep(1)
# home('egon') #wrapper('egon')
# index() #wrapper()
# print(help(index))
# print(help(home))
# print(index.__doc__)
print(index.__name__)
'''
from functools import wraps
import time
def timmer(func): # func=最原始那个home的内地址
@wraps(func)
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop-start))
return res
return wrapper
@timmer
def index():
"""这是index功能"""
print('welcome to index page')
time.sleep(3)
return 123
@timmer
def home(name):
"""这是home功能"""
print('welcome %s to home page' %name)
time.sleep(1)
print(help(index))
print(index.__name__)
有参装饰器
有参装饰器模板:
# import time
#
# user_info = {'new_user':None}
#
# def auth(func):
# def swapper(*args,**kwargs):
# if user_info['new_user'] is not None:
# res=func(*args, **kwargs)
# return res
# inp_name = input('enter your name>>: ').strip()
# inp_pwd = input('enter your password>>: ').strip()
# if inp_name == 'egon' and inp_pwd == '123':
# user_info['new_user'] = inp_name
# print('login successful')
# res = func(*args,**kwargs)
# return res
# else:
# print('err or password error')
#
# return swapper
#
# @auth
# def index():
# print('welcome to index page')
# time.sleep(2)
# return 123
# @auth
# def home(name):
# print('welcome to %s home page' %name)
# time.sleep(1)
#
#
# index()
# home('egon')
def outter2(xxx):
def outter(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
print(xxx)
return res
return wrapper
return outter
f=outter2(333)