Python装饰器是什么东西

介绍

本篇内容介绍了“Python装饰器是什么东西”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

今天说说带参数的装饰器,为了简化业务逻辑,只实现字符串大写转换的需求,重点来关注装饰器部分:

 <代码> #业务函数
def my_upper(文本):
,,价值=https://www.yisu.com/zixun/text.upper ()
,,返回值

打印(my_upper (“hello")), #你好

现在需求有变更,核心业务不变,但是需要对转换的的字符包裹一层HTM标签,输出如:<代码> & lt; p> HELLO

 <代码> def my_upper(文本):
,,价值=https://www.yisu.com/zixun/text.upper ()
,,返回“& lt; p>“+价值+“& lt;/p>“

又接到产品通知,需求有变更,还要在外面套一个div,于是你很不情愿地回去再修改:

 <代码> def my_upper(文本):
,,价值=https://www.yisu.com/zixun/text.upper ()
,,返回“& lt; div> & lt; p>“+价值+“& lt;/p> & lt;/div>“

如何应对产品这种无止境的修改呢?

不过,技术最终还是要为业务服务,那我们就想一个可以灵活应对产品的办法吧,这里,装饰器就是一个很好的方案。最终效果应该是这样:

 <代码> @tag (“p") 
def my_upper(文本):
,,价值=https://www.yisu.com/zixun/text.upper ()
,,返回值

打印(my_upper (“hello")) # & lt; p> HELLO

如何实现呢?先从简单装饰器开始,实现一个不带参数的装饰器

 <代码> def标签(函数):
,,def包装器(文本):
,,,,价值=https://www.yisu.com/zixun/func(文本)
,,,,返回“& lt; p>“+价值+“& lt;/p>“

,,返回包装

@tag
def my_upper(文本):
,,价值=https://www.yisu.com/zixun/text.upper ()
,代码,返回值

调用

 <代码>打印(my_upper (“hello")) # & lt; p> hello



@tag语法糖等价于,my_upper=标记(my_upper)

my_upper (“hello")等价于包装器(“hello")尽管你不能直接访问包装,但可以这样去理解

使用装饰器,业务代码一行的都没改,只需要在函数定义处加上装饰器,就实现了相同的功能,那么如何更灵活地通过参数来指定输出的样式呢?使用带参数的装饰器

带参数的装饰器

带参数的装饰器只需要在原来那个不带参数的装饰器基础上之上在最外层套一个函数,该函数中定义一个参数,然后嵌套函数中引用该参数即可实现。从下图看的出,我只是把里面那个函数改了一下名字,其余和原来不带参数的装饰器是一样的。有没有觉得这样更灵活?

 Python装饰器是什么东西

当然,装饰器不仅可以修饰函数,还可以修饰类。

Python装饰器是什么东西