Python装饰器
程序员文章站
2022-05-02 12:52:01
...
装饰器(Decorator)
简而言之, 装饰器是修改函数功能的函数, 可以让代码更简洁, 更有 Python 的禅意.
从最基本的函数开始
def print_my_name():
print("Hello")
很显然, 该函数调用运行后仅仅会打印 Hello, I am 再加上你的名字.
此时, 我们创建一个装饰器:
def my_decorate(func):
def wrapper():
print("*****I am decorate1*****")
func()
print("*****I am decorate2*****")
return wrapper
再用这个装饰器装饰函数并调用:
@my_decorate
def print_my_name():
print("Hello")
print_my_name()
打印结果:
*****I am decorate1*****
Hello
*****I am decorate2*****
若函数有不确定的参数该怎么办呢?
此时可以使用*args 和**kwargs, *args 没有key值(字符串, 列表等), **kwargs有key值(映射, 字典等).
代码就可以写成下面这样:
def my_decorate(func):
def wrapper(*args, **kwargs):
print("*****I am decorate1*****")
func(*args, **kwargs)
print("*****I am decorate2*****")
return wrapper
@my_decorate
def print_my_name(name):
print("Hello, I am " + name)
print_my_name('your_name')
打印结果:
*****I am decorate1*****
Hello, I am your_name
*****I am decorate2*****
再进一步, 如果想要给装饰器默认参数呢?
可以再嵌套一层:
def my_decorate(msg="Not_Hello"):
def decorated(func):
def wrapper(*args, **kwargs):
print("*****I am decorate1*****")
func(*args, **kwargs)
print(" The message is: " + msg)
print("*****I am decorate2*****")
return wrapper
return decorated
@my_decorate(msg="Hello") # 若使用默认参数仍需要添加圆括号
def print_my_name(name):
print(" Hello, I am " + name)
print_my_name('your_name')
打印结果:
*****I am decorate1*****
Hello, I am your_name
The message is: Hello
*****I am decorate2*****
默认参数很显然, 不再赘述.
下一篇: 书友汇德天教你如何做循环排队的程序模型