已知我们可以用装饰器模式去实现切面功能,啊你不知,那么请看python装饰器模式实现切面功能。
除此之外还有其他方式去实现切面功能吗?当然有,那就是python的__call__()方法,call()是一个特殊方法,用于将一个类实例变成一个可调用的对象,即可以像函数一样调用这个类。当调用一个类实例时,Python会自动调用该实例的call()方法。
语法介绍
def __call__(self, *args, **kwargs):
pass
# *args:可变位置参数,可以接收任意数量的位置参数。
# **kwargs:可变关键字参数,可以接收任意数量的关键字参数。
应用场景
- 创建可调用对象:使得对象可以像函数一样被调用。
- 封装逻辑:将某些逻辑封装在对象中,并通过调用对象来执行。
- 实现函数式编程风格:在面向对象的编程中引入函数式编程的特性。
先举个栗子
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函数。
标签:__,Python,self,add,call,time,print From: https://www.cnblogs.com/lyuSky/p/18406596