十二、装饰器 4.类装饰器和类方法装饰器

类装饰器和类方法装饰器

类中至少要有两个方法
    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
上一篇:PyTorch 1.0 中文文档:广播语义


下一篇:疯狂java讲义第四章补充习题第6题答案