python装饰器
参考:https://www.bilibili.com/video/BV1DW4y147Hm/
感觉很久没有学到python的一些新玩法了,参考B站教程
在 Python 中,装饰器(Decorator)是一种用于修改函数或者类的行为的语法结构。
装饰器允许我们在不修改函数定义的情况下,动态地修改函数的行为,从而实现更加灵活和可重用的代码。
装饰器本质上就是一个函数,它接收一个函数作为参数,并返回一个新的函数。在装饰器中,可以对原始函数进行各种操作,并返回修改后的函数。
作为一个函数时
def mydecorator(function): //接收一个函数
def wrapped(*args, **kwargs): //*args,**kwargs 接收任何参数
# 在调⽤原始函数之前,做点什么
print("Welcome")
result = function(*args, **kwargs) 调用函数
# 在函数调⽤之后,做点什么,
# 并返回结果
return result
# 返回wrapper作为装饰函数
return wrapped
@mydecorator
def my_fun(message: str):
print(f"Hello {message}")
my_fun("li_bai")
但是
print(my_fun.__name__)
wrapped
此时函数已经失去了原始的名称
此时使用functools内置的wraps()装饰器
from functools import wraps
def mydecorator(function):
@wraps(function)
def wrapped(*args, **kwargs):
# 在调⽤原始函数之前,做点什么
print("Welcome")
result = function(*args, **kwargs)
# 在函数调⽤之后,做点什么
# 并返回结果
return result
# 返回wrapper作为装饰函数
return wrapped
@mydecorator
def my_fun(message: str):
print(f"Hello {message}")
print(my_fun.__name__)
当使用的装饰器需要传入参数时
from functools import wraps
def welcome(name):
def mydecorator(function):
@wraps(function)
def wrapped(*args, **kwargs):
# 在调⽤原始函数之前,做点什么
print(f"Welcome {name}")
result = function(*args, **kwargs)
# 在函数调⽤之后,做点什么,
# 并返回结果
return result
# 返回wrapper作为装饰函数
return wrapped
return mydecorator
@welcome("wangwei")
def my_fun(message: str):
print(f"Hello {message}")
my_fun("lihua")
作为一个类
参考Python高级编程(第2版)
class DecoratorAsClass:
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
# 在调⽤原始函数之前,做点什么
print("Welcome")
result = self.function(*args, **kwargs)
# 在调⽤函数之后,做点什么,
# 并返回结果
return result
def my_fun(message: str):
print(f"Hello {message}")
p = DecoratorAsClass(my_fun)
p("喜羊羊")