Python 装饰器之__call__()

我们可以用装饰器模式去实现切面功能,不了解的同学,那么请看python装饰器模式实现切面功能

除此之外还有其他方式去实现切面功能吗?当然有,那就是python的__call__()方法,call()是一个特殊方法,用于将一个类实例变成一个可调用的对象,即可以像函数一样调用这个类。当调用一个类实例时,Python会自动调用该实例的call()方法。

语法介绍

def __call__(self, *args, **kwargs):
    pass
# *args:可变位置参数,可以接收任意数量的位置参数。
# **kwargs:可变关键字参数,可以接收任意数量的关键字参数。

应用场景

  1. 创建可调用对象:使得对象可以像函数一样被调用。
  2. 封装逻辑:将某些逻辑封装在对象中,并通过调用对象来执行。
  3. 实现函数式编程风格:在面向对象的编程中引入函数式编程的特性。

先举个栗子

class Add(object):
    def __init__(self, x):
        self.x = x

    def __call__(self, y):
        return self.x + y


add3 = Add(3)
print(add3(3))  # 输出6
print(add3(7))  # 输出10

重点来了,敲黑板!!!装饰器模式实现

import time


class Decoration(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(f"entry {self.func.__name__} method")
        start_time = time.time()
        result = self.func(*args, **kwargs)
        end_time = time.time()
        print(f'end {self.func.__name__} method cost {end_time - start_time}')
        return result


@Decoration
def add(x: int, y: int):
    time.sleep(x)
    return x + y


print(add(1, 2))
print(add(5, 2))

输出

entry add
end add method cost 1.0084202289581299
3
entry add
end add method cost 5.009873628616333
7

在上面的例子中,我们定义了一个名为Decoration的类,该类接收一个函数作为参数。call()方法则对该函数进行包装,计算其执行时间,并返回执行结果。然后我们使用@Decoration装饰器将add()函数进行包装,对add函数做了增强,并没有入侵add函数。

posted @ 2024-09-10 16:12  lyu6  阅读(108)  评论(0)    收藏  举报