带你学习Python装饰器模式

带你学习Python装饰器模式在 Java 程序员的轨迹中 经常听到装饰器模式这个词 没错 装饰器就是 23 种设计模式之一 本文将带您从 Python 语言的角度 看看装饰器模式的应用

欢迎大家来到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目录:

带你学习Python装饰器模式

在chapter01目录下新建demo01.py文件,拷贝以上代码:

带你学习Python装饰器模式

二、应用装饰器

将装饰器应用于函数,可以通过在函数定义前加上 @ 符号和装饰器名称来实现。

@my_decorator

def say_hello():

print(“Hello!”)

say_hello()

我们在demo01.py文件中加入代码:

带你学习Python装饰器模式

右键运行demo01.py文件,看到结果:

带你学习Python装饰器模式

通过装饰器注解,在运行函数之前,相当于添加了一个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文件,拷贝以上代码:

带你学习Python装饰器模式

右键运行demo02.py文件,查看结果:

带你学习Python装饰器模式

因为装饰器注解接收了参数,本例子中接收了次数参数,从而连续输出打印。

四、保留元信息

使用装饰器可能会导致被装饰函数的元信息(如函数名、文档字符串)丢失。可以使用 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文件,拷贝以上代码:

带你学习Python装饰器模式

右键运行demo03.py文件,查看结果:

带你学习Python装饰器模式

这段代码会正确地打印出 example 函数的文档字符串。

从而将注解:”””这是example函数的文档字符串”””

保留打印出来,也就是functools.wraps的作用。

通过本篇文档学习,相信您已经对装饰器模式在Python中的使用留下了印象,后续更多Python知识学习欢迎关注博主,不断更新。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/90229.html

(0)
上一篇 2024年 11月 23日 上午7:05
下一篇 2024年 11月 23日 上午7:23

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信