python装饰器类-Python类装饰器

上次介绍了Python的函数装饰器,这次我们来讲一讲Python的类装饰器。

Python的类装饰器基本语法如下:

defdecorator(cls):print "6666666"

returncls

@decoratorclassModel(object):def __init__(self):print "model created"

if __name__ == '__main__':

model= Model()

decorator即是装饰器函数,输入的cls是一个类,返回也是一个类(其实返回一个可调用对象就可以,例如函数)。所以其实上文的类装饰器就相当于:

Model = decorator(Model)

由于装饰器是在加载该模块时运行的,因此上文代码中装饰器输出的"6666666"只会在加载该模块时输出一次。

这只是最基本的版本,既然返回只要是一个可调用对象就可以,我们就可以对输入的类进行一系列魔改:

classA(object):def __init__(self):print "77777"

defdecorator(cls):returnA

@decoratorclassModel(object):def __init__(self):print "model created"

if __name__ == '__main__':

model=Model()print model

输出为:

77777

<__main__.A object at 0x00B0F850>

可以看到,通过类装饰器,已经把返回的类悄悄地进行了替换,最终生成的其实是A的对象。

类装饰器可以对类对象进行修改:

defdecorator(cls):

cls.test_val= 1

returncls

@decoratorclassModel(object):

test_val=0def __init__(self):pass

if __name__ == '__main__':

model=Model()print model.test_val

经过类装饰器的修饰,Model类的test_val值已经被改成了1。

类装饰器也可以带参数:

defdecorator(num):printnumdefdec2(cls):returnclsreturndec2

@decorator(1)classModel(object):def __init__(self):pass

最后要注意的是,对于继承关系,若f装饰了类A,类B继承了A,则产生B的对象时仍然会调用装饰器f,但装饰器f只会修饰类A。如下代码所示:

defdecorator(num):printnumdefdec2(cls):printclsreturnclsreturndec2defdecorator2(cls):printclsreturncls

@decorator(1)classModel(object):

test_val=0def __init__(self):pass@decorator2classSubModel(Model):def __init__(self):pass

if __name__ == '__main__':

model= SubModel()

得到的输出为:

1

第一行和第二行是由decorator输出的,第三行是由decorator2输出的。对decorator来说,它只知道Model的存在,因此在decorator中调用SubModel的对象则会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值