通过语法糖、装饰器的方法将原函数名指向的内存地址偷梁换柱成wrapper函数;
但是当调被装饰对象的内置函数时,仍然显示的是wrapper,伪装的并不彻底。
import time
def outter(func):
def wrapper(*args, **kwargs):
'''这是个主功能'''
start = time.time()
func(*args, **kwargs)
stop = time.time()
print(stop - start)
return wrapper
@outter # index=outter(index)
def index(x, y, z):
time.sleep(3)
print(f'index {x} {y} {z}')
@outter # home=outter(home)
def home(a):
time.sleep(1)
print(f'这是一个home函数,它的参数是:{a} ')
index(1, 2, 3)
home('winnie')
print(index.__name__)
print(index.__doc__)
结果:
index 1 2 3
3.00010347366333
这是一个home函数,它的参数是:winnie
1.0002923011779785
wrapper
这是个wrapper函数
这是个主功能
将wrapper做的跟原函数一样,需要导入wraps包
from functools import wraps
import time
def outter(func):
@wraps(func)
def wrapper(*args, **kwargs):
'''这是个wrapper函数'''
start = time.time()
func(*args, **kwargs)
stop = time.time()
print(stop - start)
return wrapper
@outter # index=outter(index)
def index(x, y, z):
'''这是个index函数'''
time.sleep(3)
print(f'index {x} {y} {z}')
@outter # home=outter(home)
def home(a):
time.sleep(1)
print(f'这是一个home函数,它的参数是:{a} ')
index(1, 2, 3)
home('winnie')
print(index.__name__)
print(index.__doc__)
结果:
index 1 2 3
3.000398635864258
这是一个home函数,它的参数是:winnie
1.000969409942627
index
这是个index函数