欢迎光临
我们一直在努力

什么是装饰器?有什么用?

目录

一.什么是装饰器?

1.定义

2.装饰器的优势

3.语法

4.举例

①定义装饰器(本质就是函数)

②给需要被增强的函数,加上注解

③执行代码,查看效果

二.原理

1.文字说明

2.举例说明

三.参数

1.问题

2.解决方案

四.返回值

1.问题

2.解决方案


一.什么是装饰器?

1.定义

装饰器本质就是函数。

它用来扩展和增强其他函数的功能,而无需修改其他函数(无侵入增强,说白了就是Java中的切面编程)。

2.装饰器的优势

无侵入增强其他函数的功能,提供了一种可扩展性、模块化的编程方式。

3.语法

4.举例

场景:我们想要给下图的三个函数增强,分别在发送前、后,打印“准备开始”、“发送结束”的字样。此时就需要用到装饰器

步骤如下

①定义装饰器(本质就是函数)

def outer(func):
def x():
print("准备开始")
func() #被装饰(增强)的函数
print("发送结束")
return x

②给需要被增强的函数,加上注解

③执行代码,查看效果

二.原理

1.文字说明

装饰器的原理是:将被装饰的函数作为参数传递给装饰器函数,返回一个新的函数(或可调用对象)来替换原函数,从而在不修改原函数代码的情况下增加额外功能。

2.举例说明

如下图,当执行被增强函数send_wechat()的时候,发现带有@outer注释(装饰器函数),于是就等于执行outer(send_wechat)这个装饰器函数,然后就会执行outer内部的x函数,此时很明显,原函数就得到了增强了。

三.参数

1.问题

如下图,如果被增强(装饰)的原函数,有参数,那么此时被装饰器增强的时候,就会报错,因为装饰器没处理原函数的参数,此时直接就蒙了。

def outer(func):
def x():
print("准备开始")
func() #被装饰(增强)的函数
print("发送结束")
return x

@outer
def send_wechat(user1, user2):
print("微信", user1, user2)

if __name__ == '__main__':
send_wechat("张三", "李四")

可见此时果然报错了。

2.解决方案

给装饰器的内部函数,加上

*args, **kwargs

这表示接受若干个参数。

运行项目,查看效果

四.返回值

1.问题

当被装饰(增强)的函数,有返回值时,如果装饰器不进行任何改动,则会直接报错。

def outer(func):
def x():
print("准备开始")
func() #被装饰(增强)的函数
print("发送结束")
return x

@outer
def send_wechat():
print("微信")
return 100

if __name__ == '__main__':
res = send_wechat()
print(res)

运行项目

2.解决方案

运行项目,测试效果

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~

赞(0)
未经允许不得转载:171主机测评 » 什么是装饰器?有什么用?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址