美文网首页
装饰器(三)-类装饰器

装饰器(三)-类装饰器

作者: mysimplebook | 来源:发表于2019-12-24 12:44 被阅读0次

    前面提到的都是def定义的装饰器函数,实际上也可以使用一个类装饰函数。在python中,一般callable对象都是函数,但是也有例外,比如只要某个对象重写了call方法,那么这个对象就是callable的。类就需要定义一个__call__方法变成callable,且在__init__方法中声明一个参数,用于引用被修饰函数,从而实现一个类装饰器。如

    class Test(object):

        def __init__(self, func):

            print('test init')

            print('func name is %s ' %func.__name__)

            self.__func = func                                         #函数引用

        def __call__(self, *args,**kwargs):

            print('定义一些装饰器中的功能')

            self.__func()

    将此装饰器应用于一个函数上,如

    >>> @Test

    ... def test():

    ...     print('this is test func')

    ...

    test init

    func name is test

    >>> test()

    定义一些装饰器中的功能

    this is test func

    >>> 

     

    和之前的原理一样,当python解释器执行到到@Test时,会把当前test函数作为参数传入Test对象,调用init方法,同时将test函数指向创建的Test对象,那么在接下来执行test()的时候,其实就是直接对创建的对象进行调用,执行其call方法。上述代码等效于

    >>> test=Test(test)                                 #传入原test函数

    test init

    func name is test

    >>> test()

    定义一些装饰器中的功能

    this is test func

    >>> 

    相关文章

      网友评论

          本文标题:装饰器(三)-类装饰器

          本文链接:https://www.haomeiwen.com/subject/hloxoctx.html