在 python 中我们可以利用一个函数作为装饰器来装饰另一个函数, 但是装饰器只能是函数吗 ? 当然了我们还可以使用类来作为装饰器!
- class A(object):
- def __init__(self,func):
- print('定义初始化函数')
- print('func name is %s'%func.__name__)
- self.__func = func
- def __call__(self):
- print('call 方法作为装起中的功能')
- self.__func()
- print('增加的功能 2')
- # @A
- def B():
- print('这个是 B 是原函数')
- # A(B)
- # 如果不看装饰器的作用的话, 这里的 A(B) 和上面的 @A 相等作用相同, 但是这里的作用就是是装饰器了, 就只是简单的函数调用了, 所以就不会调用 call 方法了
这个的输出结果是:
定义初始化函数
func name is B
注意:
这里的为什么会打印出 B 而不是 A, 我简单的解释下,
我们把 A 当做装饰器调用, 也就相当于调用了 A 这个类 A(B)
这样的话我们就传入了参数 B 这个函数, 所以 func.name 这个就是 B 了
这里初始化的调用就完成了
- class A(object):
- def __init__(self,func):
- print('定义初始化函数')
- print('func name is %s'%func.__name__)
- self.__func = func
- def __call__(self):
- print('call 方法作为装起中的功能')
- self.__func()
- print('增加的功能 2')
- @A
- def B():
- print('这个是 B 是原函数')
- # A(B)
- B()
这个的输出结果是:
定义初始化函数
func name is B
call 方法作为装起中的功能
这个是 B 是原函数
增加的功能 2
注:
这里我们把类当做装饰器了, 所以他就会去调用 call 方法, 也就自然会调用下面的方法了!
来源: http://www.bubuko.com/infodetail-2726455.html