Python 类装饰器

Python 类装饰器

类装饰器顾名思义用类写的装饰器,首先看类的定义

class A:
        def __init__(self, arg = 'a'):
                print( arg )

        def __call__(self, arg): #使对象可以像函数一样调用
                print( arg )
                self.doSomething()

        def doSomething(self):
                print("doSomething")  
a = A(1)#实例化一个对象
a(2)    #把对象当函数来调用需要实现__call__方法

上面的例子中我们看到类可以向函数一样调用,下面我们就实现一个类的装饰器:

from functools import wraps
class A:
        def __call__(self, func):
                @wraps(func) #会把func信息导入到wrapper函数中
                def wrapper( *args, **kw ):
                        self.doSomething()
                        return func( *args, **kw)
                return wrapper

        def doSomething(self):
                print('doSomething')

@A() #相当于 func=A()(func) ,A实现了__call__方法所以A()产生的实例可以调用
def func():
        print("func")

func()
'''
结果:
doSomething
func
'''

有了装饰器后为什么还要发明 一个类装饰器呢?我们看下面一段代码体会他的优点:

from functools import wraps
class A:
        def __call__(self, func):
                @wraps(func)
                def wrapper( *args, **kw ):
                        self.doSomething()
                        return func( *args, **kw)
                return wrapper

        def doSomething(self):
                print('doSomething')

class B(A): #B继承A类,重写A类的doSomething方法
        def doSomething(self):
                print("B doSomething")

@B()
def func():
        print("func")
func()
'''
结果:
B doSomething
func
'''

总结:使用类装饰器可以通过继承的方式扩展类装饰器的行为。

你可能感兴趣的:(Python)