欢迎大家来到IT世界,在知识的湖畔探索吧!
在Java程序员的轨迹中,经常听到装饰器模式这个词,没错,装饰器就是23种设计模式之一。
本文将带您从Python语言的角度,看看装饰器模式的应用。
在学习之前,保证你先安装Python环境,推荐安装Anaconda或者原始版Python工具,然后使用Juypter帮助你编写运行Python代码,也可以使用PyCharm IDE。
博主使用的就是PyCharm IDE社区版开发工具,教程介绍也通过PyCharm来演示。
一、基本装饰器定义
首先定义一个装饰器函数,它接收一个函数作为参数,并返回一个新的函数。
示例如下:
def my_decorator(func):
def wrapper():
print(“Something is happening before the function is called.”)
func()
print(“Something is happening after the function is called.”)
return wrapper
我们新建chapter01目录:
在chapter01目录下新建demo01.py文件,拷贝以上代码:
二、应用装饰器
将装饰器应用于函数,可以通过在函数定义前加上 @ 符号和装饰器名称来实现。
@my_decorator
def say_hello():
print(“Hello!”)
say_hello()
我们在demo01.py文件中加入代码:
右键运行demo01.py文件,看到结果:
通过装饰器注解,在运行函数之前,相当于添加了一个AOP拦截,保证结果拦截输出,发挥了装饰器的作用。
三、带参数的装饰器
如果需要装饰器接受参数,可以在装饰器外再加一层函数。
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, kwargs):
for _ in range(num_times):
result = func(*args, kwargs)
return result
return wrapper
return decorator_repeat
@repeat(3)
def greet(name):
print(f”Hello {name}”)
greet(“Alice”)
我们在chapter01目录下新建demo02.py文件,拷贝以上代码:
右键运行demo02.py文件,查看结果:
因为装饰器注解接收了参数,本例子中接收了次数参数,从而连续输出打印。
四、保留元信息
使用装饰器可能会导致被装饰函数的元信息(如函数名、文档字符串)丢失。可以使用 functools.wraps 来保留这些信息。
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper():
“””这里是wrapper的文档字符串”””
print(“Before call.”)
func()
print(“After call.”)
return wrapper
@my_decorator
def example():
“””这是example函数的文档字符串”””
print(“Inside example function.”)
print(example.__doc__)
我们在chapter01目录下新建demo03.py文件,拷贝以上代码:
右键运行demo03.py文件,查看结果:
这段代码会正确地打印出 example 函数的文档字符串。
从而将注解:”””这是example函数的文档字符串”””
保留打印出来,也就是functools.wraps的作用。
通过本篇文档学习,相信您已经对装饰器模式在Python中的使用留下了印象,后续更多Python知识学习欢迎关注博主,不断更新。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/90229.html