1.定义装饰器
装饰器:我们要增强函数的功能,比如,比如在函数调用前后自动打印日志,但又不希望修改函数的定义,
这种在代码运行期间动态增加功能的方式,称之为‘装饰器’(decorator)
#定义装饰器
import time
#计算函数运行时间
def run_time(func):
def wrapper():
start_time = time.time()
func()#调用multiply函数
spend_time = time.time() - start_time
return spend_time
return wrapper
@run_time#等价于multiply = run_time(multiply)
def multiply():
sum = 0
for i in range(5):
sum = sum +i
print(sum)
print(multiply())
2.使用装饰器
2.1使用方法一
#now = decorator(函数名)#装饰器不传入参数时
#now = decorator(参数)(函数名)#装饰器传入参数时
#now()#执行被装饰过的函数
2.2使用方法二
#@decorator#以定义的装饰器
# def f():#自定义函数
# pass
# f()#执行被装饰过的函数
3.自身不传入参数的装饰器
def login(func):
def wrapper(*args,**kargs):
print('函数名:%s'% func.__name__)
return func(*args,**kargs)
return wrapper
@login
def f():
print('inside decorator')
f()
4.自身传入参数的装饰器
def login(text):
def decorator(func):
def wrapper(*args,**kargs):
print('%s---%s'% (text,func.__name__))
return func(*args,**kargs)
return wrapper
return decorator
@login('this is a parameter of decorator')
def f():
print('2021-02-21')
f()
4.1传参装饰器实例一
class Profile():
def __init__(self):
self.name = 'peter'
self.sex = 'man'
self.age = 22
self.city = 'yunnan'
def pass_token(symbol):
def decorator(func):
def wrapper():
if symbol == '20210221':
profile = Profile()
func(profile)
else:
print('pass_token错误!')
return wrapper
return decorator#返回装饰者
@pass_token('20210221')
def get_info(self):
print(f'姓名:{self.name}\n性别:{self.sex}\n年龄:{self.age}\n所在地:{self.city}')
get_info()
#输出结果:
# 姓名:peter
# 性别:man
# 年龄:22
# 所在地:yunnan
4.2传参装饰器实例二
class Profile():
def __init__(self):
self.name = 'peter'
self.sex = 'man'
self.age = 22
self.city = 'yunnan'
class Message():
def __init__(self):
self.type = 'text'
self.content = 'hello'
self.sender = 'peter'
def choose_func(symbol):
def decorator(func):
if symbol == 'user':
def wrapper():
profile = Profile()
func(profile)
elif symbol == 'message':
def wrapper():
message = Message()
func(message)
else:
print('请检查装饰器参数')
return wrapper
return decorator
@choose_func('user')
def get_user(user):
print(f'姓名:{user.name}\n性别:{user.sex}\n年龄:{user.age}\n所在地:{user.city}')
get_user()
#输出结果:
#姓名:peter
#性别:man
#年龄:22
#所在地:yunnan
@choose_func('message')
def get_message(message):
print(f'消息类型:{message.type}\n内容:{message.content}\n发送者:{message.sender}')
get_message()
#输出结果:
#消息类型:text
#内容:hello
#发送者:peter