Python中的装饰器是通过利用了函数特性的闭包实现的。
闭包的实现: Python中的装饰器是通过闭包实现的,简单地讲,闭包就是引用了外部变量的内部函数,而闭包的实现正是利用了以上函数特性,下面我们来看看闭包是如何实现的
def
outer(x):
def
inner():
# 函数嵌套
return
x
# 跨域访问,引用了外部变量x
return
inner
# 函数作为返回值
closure
=
outer(
'外部变量'
)
# 函数作为变量赋给closure
print
(closure())
# 执行闭包
实际上,类也可以作为装饰器。类装饰器主要依赖于函数__call__()
,每当你调用一个类的示例时,函数__call__()
就会被执行一次。
class Count:
def __init__(self,func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
print('func is called num is:{}'.format(self.count))
return self.func(*args, **kwargs)
@Count
def index():
print('i am dyf...')
for i in range(10):
index()
#结果
func is called num is:1
i am dyf...
func is called num is:2
i am dyf...
func is called num is:3
i am dyf...
func is called num is:4
i am dyf...
func is called num is:5
i am dyf...
func is called num is:6
i am dyf...
func is called num is:7
i am dyf...
func is called num is:8
i am dyf...
func is called num is:9
i am dyf...
func is called num is:10
i am dyf...
我们定义了类 Count,初始化时传入原函数 func()
,而__call__()
函数表示让变量 num_calls 自增 1,然后打印,并且调用原函数。因此,在我们第一次调用函数 example()
时,num_calls 的值是 1,而在第二次调用时,它的值变成了 2