美文网首页编程
Python装饰器(5)类装饰器

Python装饰器(5)类装饰器

作者: Bblsc | 来源:发表于2018-10-05 17:45 被阅读0次

    内容纯属个人理解,不对之处,欢迎指正。

    __call__

    在Python中,具有__call__方法的对象才可以被执行,执行的过程就是__call__被调用的过程。
    示例:

    #定义类A,然后定义__call__方法使其返回两个参数的乘积
    class A:
        def __call__(self, x, y):
            return x * y
    
    >> a = A()
    >> a(2, 6)
    12
    >> a.__call__(2, 6)
    12
    

    由此可以看出,当给类生成的对象传入参数后,类自动调用__call__方法,由此特性,我们便可以使用类去构造装饰器。

    构造类装饰器

    装饰器构造需要函数传递与参数传递,在程序执行时,就需要先装饰函数,所以当函数的传递应该在类中首先执行,那么函数的传递就应该在对象初始化部分:

    def __init__(self, func):
        self.func = func
    

    由于__call__方法中是接收参数并执行,那么__call__中接收的便是func函数的参数:

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

    自定义实现类装饰器

    # 通过函数结果来返回不同的值:奇数返回1,偶数返回-1
    class Odevity:
    
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            ret = self.func(*args, **kwargs)
            if ret % 2 == 0:
                return -1
            else:
                return 1
    
    
    @Odevity
    def foo(x, y):
        return x + y
    
    >> foo(1, 2)
    1
    >> foo(1, 3)
    -1
    

    相关文章

      网友评论

        本文标题:Python装饰器(5)类装饰器

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