成都创新互联网站制作重庆分公司

python装饰器的用途是什么

这篇文章给大家分享的是有关python装饰器的用途是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

创新互联公司2013年成立,先为如东等服务建站,如东等地企业,进行企业商务咨询服务。为如东企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

首先,什么是装饰器?

比较官方的解释是:

装饰器是用来管理和调用函数和类的一个可调用对象,也就是说分为函数装饰器和类装饰器

这个定义函数我自己通俗化了一点,不然更加看不懂,其实我还有一句更加概括的话,可以解释装饰器:

装饰器就是对被装饰的对象(函数、类)进行重构的,其可以在不改变原来对象的情况下调用对象时执行重构后的行为

这里你可能就糊涂了,看不懂

没关系我们慢慢来!!!

首先,装饰器的语法你肯定知道

def decorator(f):
    def wrapper(x,y):
        return x+y
    return wrapper
@decorator
def func(x,y):
    return 1
func(3,4)

那,看这段代码,你可能根据上面你有几个疑问:

一、decorator是什么意思?

二、这里重构的行为是什么?

三、整个装饰的行为或者说流程是怎么样的?

我们看上面那一段代码,很显然,说过装饰器就是一个可调用对象,这个没问题吧,在上面的装饰器它就是一个函数。

重构的行为是什么?

上面的一段代码的重构行为就是讲func的执行代码替换成了wrapper的执行代码,也就是说,代码的最终输入是 7 而不是 1。

其实上面的两个问题是废话,我们解决了第三个问题,自然而然的就理解了!

好了,在继续看之前我们记住一句话:

装饰器本身接受被装饰的对象,装饰器返回的可调用对象接受被装饰对象的所有参数

一定要仔细看这句话,理解加记忆!

在上面那一段代码中

装饰器是: decorator

返回的可调用对象是: wrapper

被装饰的对象是 :func

好了,你先在套这个你去看看这个这个函数的执行流程

当然,这时候你还会有一个疑问:

当调用func(3,4)的时候发生了什么?

此时:返回的可调用对象(wrapper)给了func,你也可以理解为现在的func的代码是

def func(x,y):
    return x+y

这时的func就完全不是自己本身定义的func的,它是不是在某种意义上算是被重构了!

到这里你是不是理解了什么是装饰器,应该是理解了!

不过我们还没有结束,因为我要让你彻底的了解什么是装饰器!

之前我们说过,不止有函数装饰器,还有类装饰器,那接下来我们就看看类装饰器是怎么工作的,我还是要把之前那段话贴在这里,你别忘了!

装饰器本身接受被装饰的对象,装饰器返回的可调用对象接受被装饰对象的所有参数

class Decorator:
    def __init__(self,f):
        self.func = f
    def __call__(self,x,y):
        return self.func(x,y) + 1
@Decorator
def func(x,y):
    return x+y
func(3,4)
# 你来想想这时候的结果是什么?

我们来一步步的分析一下,

首先,我们说装饰器只接受被装饰的对象做参数,也就是说此时有

Decorator(func)
 # 这段代码对应着第一句话
 # 接下来是
 func(3,4)
 # 这句话是不是触动了__call__方法
 # 接下来就是第二句话:返回的可调用对象接受被装饰对象的所有参数
 # 所以3,4就被传递给了__call__方法
 # 此时的func是什么
 return self.func(x,y) + 1
 # 也就是说结果为8,而不是7

接下来来点难的看看:

def decorator(f):
    def wrapper(self,x,y):
        return self.name + x + y
    return wrapper
class C:
    name = '土'
    @decorator
    def method(x,y):
        return x + y
ins = C()
myname = ins.method('行','孙')

感谢各位的阅读!关于python装饰器的用途是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!


新闻标题:python装饰器的用途是什么
链接URL:http://cxhlcq.com/article/jhjejj.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部