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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值