Reference article
Decorator
Everyone who has used Java knows that Java's AOP is very convenient. It can do some operations before and after calling methods, such as printing logs. Python also has a similar function, which is the decorator. Let's take the printing log as an example.
Before printing the log
def buy(good_name):
print("购买商品 %s " % good_name)
def payment(money: int):
print("支付金额 %d " % money)
if __name__ == "__main__":
buy("10斤苹果")
payment(30)
operation result:
购买商品 10斤苹果
支付金额 30
Automatically print log before function call
Print log function
import functools
# 在函数调用前自动打印日志
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print("call function: %s args: %s kw: %s " % (func.__name__, args, kw))
return func(*args, **kw)
return wrapper
Add a comment on the calling function
@log
def buy(good_name):
print("购买商品 %s " % good_name)
@log
def payment(money: int):
print("支付金额 %d " % money)
if __name__ == "__main__":
buy("10斤苹果")
payment(30)
operation result:
call function: buy args: ('10斤苹果',) kw: {}
购买商品 10斤苹果
call function: payment args: (30,) kw: {}
支付金额 30
Print logs before and after the function call
# 在函数调用前后自动打印日志
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print("start call function: %s args: %s kw: %s " % (func.__name__, args, kw))
result = func(*args, **kw)
print("end call function: %s args: %s kw: %s " % (func.__name__, args, kw))
return result
return wrapper
operation result:
start call function: buy args: ('10斤苹果',) kw: {}
购买商品 10斤苹果
end call function: buy args: ('10斤苹果',) kw: {}
start call function: payment args: (30,) kw: {}
支付金额 30
end call function: payment args: (30,) kw: {}
Customize parameters and print logs before and after the function call
def log(description="", version="1.0"):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print("start %s version=%s . call function: %s args: %s kw: %s " % (
description, version, func.__name__, args, kw))
result = func(*args, **kw)
print("end %s version=%s . call function: %s args: %s kw: %s " % (
description, version, func.__name__, args, kw))
return result
return wrapper
return decorator
@log(description="购买商品", version="2.2")
def buy(good_name):
print("购买商品 %s " % good_name)
@log(description="支付金额")
def payment(money: int):
print("支付金额 %d " % money)
if __name__ == "__main__":
buy("10斤苹果")
payment(30)
operation result:
start 购买商品 version=2.2 . call function: buy args: ('10斤苹果',) kw: {}
购买商品 10斤苹果
end 购买商品 version=2.2 . call function: buy args: ('10斤苹果',) kw: {}
start 支付金额 version=1.0 . call function: payment args: (30,) kw: {}
支付金额 30
end 支付金额 version=1.0 . call function: payment args: (30,) kw: {}