欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

采用__call__ 实现装饰器模式

程序员文章站 2022-05-18 20:43:28
装饰器模式在实现中也是很常见的:比如手机贴膜,手机壳 都是为了给手机增加一些额外功能 增加耐操 装饰器模式的本质就是对对象二次包装,赋额外功能 __call__ __call__是python魔术方法——可调用对象,指的是可以实现一个对象实例以函数的方式来调用。 class Test: def __ ......

装饰器模式在实现中也是很常见的:比如手机贴膜,手机壳 都是为了给手机增加一些额外功能 增加耐操

装饰器模式的本质就是对对象二次包装,赋额外功能

__call__

__call__是python魔术方法——可调用对象,指的是可以实现一个对象实例以函数的方式来调用。

class test:
    def __call__(self, *args, **kws):
        print(*args, **kws)


t = test()

t("你好","hello word")

 

无参数装饰器

现在有一个out函数,用于打印输出。现在要想要统计这函数执行了多少次

class count:
    def __init__(self,func):
        self.func = func
        self.i = 0

    def __call__(self,*args,**kws):
        self.i += 1
        print(f"执行次数:{self.i}")
        return self.func(*args,**kws)

@count
def out(s):
    print(s)

out("你好")
out("呵呵")

'''
相当于
out = count(out)   
out()
把函数传入count类中,创建对象实例 然后利用__call__魔术方法实现执行可调用对象
'''

 

有参数装饰器

现在count类有一个属性color,给统计数值上颜色。

class count:
    def __init__(self, color):
        self.color = color
        self.i = 0

    def __call__(self, func):
        self.func = func
        return self.__callback

    def __callback(self, *args, **kw):
        self.i += 1
        print(f"执行次数:{self.color} {self.i}")
        return self.func(*args, **kw)


@count("红色")   # 接收参数
def test(s):
    print(s)


test("哈哈") 

'''
等价于
d = count("红色")
test = d(test)
test("哈哈")
'''
test("哈哈") test("哈哈")

''' 输出
执行次数:红色 1
哈哈
执行次数:红色 2
哈哈
执行次数:红色 3
哈哈
'''