python类装饰器即__call__方法

上一篇中我对学习过程中的装饰器进行了总结和整理,这一节简单整理下类装饰器

1.类中的__call__方法:

我们在定义好一个类后,实例化出一个对象,如果对这个对象以直接在后边加括号的方式进行调用,程序就会报错。也就是在类中这种做法是错误的;

而,如果一个类中写入了__call__方法,当我问在对实例对象以括号的方式进行调用时,__call__方法中的语句就会被执行,代码如下:

 1 import time
 2 # 定义一个Time类
 3 class Time(object):
 4     def __init__(self,a):
 5         self.a = a
 6     def __call__(self, *args, **kwargs):
 7         print(self.a )
 8 # 对类进行实例化
 9 now = time.ctime()
10 c = Time(now)
11 # 调用类中的call方法
12 c()
13 # 结果为:Tue Jun 12 17:28:53 2018

2.类作为装饰器的底层原理和上一篇中所谈到的是一致的,以下边代码为示例:

# 定义一个Time类
class Time(object):
    def __init__(self,func): # 注意这里要设定参数接收Test
        self._func = func
    def __call__(self):
        print('我可以对函数进行装饰')
        print("----------------------------")   
        self._func()

@Time # 等价于 Test = Time(Test)
def Test():
    print('测试一下可不可以.')

Test()

#结果为:
#我可以对函数进行装饰
#----------------------------
#测试一下可不可以.