类装饰器和类方法装饰器
类中至少要有两个方法
1.__init__()和__call__()
__init__接收func为self.func(),__call__装饰self.func()
@ClassName 返回的结果为obj,调用原函数时等同于obj(),此时触发__call__完成装饰
2.__call__()和成员方法
__call__接收func为self.func(),并return成员方法,成员方法中装饰self.func()
@ClassName() 返回的结果为obj(),此时触发__call__返回成员方法,在成员方法中完成装饰
# 类装饰器
class Outer():
def __call__(self, func):
# 把传递进来的原函数定义为成员方法
self.func = func
return self.inner
# 在需要返回的方法中进行装饰
def inner(self, x, y, Func):
print('A')
self.func(x, y, Func)
print('B')
# 使用类装饰器装饰函数
# 如果此处为 @Outer,则等同于 demo = Outer(demo),demo() 就等同于 Outer_obj(),效果为直接触发 __call__()
@Outer() # Outer()实例化obj -> @obj的含义是把obj当成函数调用 -> obj(demo) -> 触发__call__() -> 返回inner()
def demo(x, y, Func):
print(Func([x, y]))
demo(2, 8, sum) # 此时的demo()等同于Outer类中的成员方法inner()
A
10
B
# 类方法装饰器
class Outer():
def recv_func(func):
# 把传递进来的原函数定义为类方法
Outer.func = func
return Outer.inner
# 在需要返回的方法中进行装饰
def inner():
print('C')
Outer.func()
print('D')
# 使用类方法装饰器装饰函数
@Outer.recv_func # Outer.recv_func(demo) -> 返回类方法Outer.inner()
def demo():
print('EF')
demo() # 此时的demo()等同于Outer类中的类方法Outer.inner()
C
EF
D