• 技术文章 >后端开发 >Python教程

    python装饰器是什么

    藏色散人藏色散人2019-07-04 10:51:00原创6079

    首先,什么是装饰器?

    比较官方的解释是:

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

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

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

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

    没关系我们慢慢来!!!

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

    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装饰器是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:python装饰器
    上一篇:阶乘python怎么打 下一篇:mac怎么安装python
    PHP编程就业班

    相关文章推荐

    • c++和python的区别有哪些• int在python中什么意思• python怎么制作游戏脚本• 阶乘python怎么打

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网