Java教程

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

本文主要是介绍十二、装饰器 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
这篇关于十二、装饰器 4.类装饰器和类方法装饰器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!