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
'''

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值