"""
储备知识点
*args,**kwargs
名称空间与作用域
函数对象
函数的嵌套定义
闭包函数
无参装饰器
有参装饰器
"""
# 1.*args,**kwargs
# def index(x, y):
# print(x, y)
#
#
# def wrapper(*args, **kwargs):
# index(*args, **kwargs)
#
#
# wrapper(y=222, x=111)
# 2.名称空间与作用域:名称空间的“嵌套”关系是在函数的定义阶段,即检测语法的时候确定的
# 3.函数对象:
# 可以把函数当做参数传入
# 可以把函数当做返回值返回
# def index():
# return 123
#
#
# def foo(func):
# return func
#
#
# res = foo(index)
# print(res)
# print(res())
# 4.函数的嵌套定义
# def outter():
# def wrapper():
# pass
# return wrapper
# 闭包函数
# def outter(x):
# def wrapper():
# print(x)
# return wrapper
#
#
# f1 = outter(1)
# f1()
----装饰器介绍
"""
1.什么是装饰器
装饰器指的是定义一个函数,该函数用来装饰其他函数,为其他函数添加功能
2.为何要使用装饰器
开放/封闭原则
开放:指的是对拓展功能是开放的
封闭:指的是对修改源代码是封闭的
在不修改被装饰对象源代码以及调用方式的前提下为被装饰对象添加新功能
3.如何使用装饰器
"""
import time
from functools import wraps
# def index(x, y):
# time.sleep(3)
# print('welcome %s %s' % (x, y))
#
#
# def home(name):
# time.sleep(2)
# print('welcome %s to home' % name)
# return 123
#
#
# def outter(func):
# def wrapper(*args, **kwargs):
# start = time.time()
# res = func(*args, **kwargs)
# stop = time.time()
# print(stop - start)
# return res
# return wrapper
#
#
# index = outter(index)
# index(111,222)
#
# home = outter(home)
# res = home('SEPIA')
# print('返回值==>', res)
# 语法糖
# 在被装饰对象正上方单独一行写@装饰器名字
def timmer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper
@timmer
def index(x, y):
"""这是主页功能"""
time.sleep(3)
print('welcome %s %s' % (x, y))
@timmer
def home(name):
time.sleep(2)
print('welcome %s to home' % name)
return 123
index(111, 222)
home('SEPIA')
print(index.__name__)
print(index.__doc__)