装饰器:在不修改原函数的代码和调用方式的前提下 为原函数添加额外的功能
无参装饰器模板
from functools import wraps
def outter(func):
@wraps(func) # 统一处理原函数属性
def inner(*args, **kwargs):
print('装饰后额外提供的功能1', args)
res = func(*args, **kwargs)
# 1> func 是原函数的内存地址
# 2> *args, **kwargs 原函数的参数
# 3> res 原函数的返回值
print('装饰后额外提供的功能2', args)
return res
return inner
@outter
# 1、person = outter(person)
def person(name): # (1)未修改原函数代码
'''person function'''
print('原函数 {}'.format(name))
# 2、查看伪装的是否与被装饰的函数一模一样
print('person.__doc__ >>> ', person.__doc__)
print('person.__name__ >>> ', person.__name__)
# 3、person(name) # (2)调用方式不变
person('haha-无参装饰器') # (3)额外增加了功能
有参装饰器模板
from functools import wraps
def auth(data_type):
def outter(func):
@wraps(func) # 统一处理原函数属性
def inner(*args, **kwargs):
print('装饰后额外提供的功能1', args)
res = func(*args, **kwargs)
# 1> func 是原函数的内存地址
# 2> *args, **kwargs 原函数的参数
# 3> res 原函数的返回值
print('装饰后额外提供的功能2', args)
return res
return inner
return outter
@auth('file')
# 1、@ + auth('file')
# 2、@outter
# 3、login = outter(login)
def login(name, passwd): # (1)未修改原函数代码
'''login function'''
print('原函数 {} {}'.format(name, passwd))
# 4、查看伪装的是否与被装饰的函数一模一样
print('login.__doc__ >>> ', login.__doc__)
print('login.__name__ >>> ', login.__name__)
# 5、login(name,passwd) # (2)调用方式不变
login('haha-有参装饰器', 123) # (3)额外增加了功能