python 类装饰器

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

你可能感兴趣的:(类装饰器)