上次介绍了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的对象则会报错。

python装饰器类-Python类装饰器相关推荐

  1. Python 闭包、单个装饰器、多个装饰器、装饰器修饰类、应用场景

    1. 闭包 在 Python 中,函数也可以作为参数.我们可以执行下面的代码: def func(a, b):return a + bprint(func) 我们直接输出函数名,而没有加括号.输出结果 ...

  2. python装饰器类-Python 装饰器、类装饰器、属性装饰器

    今天来介绍一下python的装饰器. 1.首先来介绍一下简单的装饰器, def play(): return "i can play" if __name__ == '__main ...

  3. python装饰器类-python_类装饰器

    一.定义 装饰器就是一个给对象添加额外功能的函数,其本质是函数.它的基本构造:高阶函数+函数嵌套+闭包.基础知识讲解详见:https://blog.51cto.com/10836356/2095118 ...

  4. python装饰器类-Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  5. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

  6. Python基础(八)--迭代,生成器,装饰器与元类

    目录 Python基础(八)--迭代,生成器,装饰器与元类 1 迭代 1.1 可迭代对象与迭代器 1.2 自定义迭代类型 1.3 迭代合体 2 生成器 2.1 什么是生成器 2.2 生成器表达式 2. ...

  7. Python中的property类和@property装饰器

    Python中的property类和@property装饰器 在Python的类中,为了避免使用者直接在类的外部操作属性和方法,我们可以将属性和方法设置成私有属性和私有方法. 如果我们需要访问私有属性 ...

  8. python装饰器class_PYTHON里的装饰器能装饰类吗

    展开全部 Python 装饰2113器装饰类中的方法 目前在中文网上能5261搜索到的绝大部分关于4102装饰器的教程,都在讲如何装饰一个1653普通的函数.本文介绍如何使用Python的装饰器装饰一 ...

  9. Python:闭包(简介、使用方法、nonlocal修改闭包内使用的外部变量)、装饰器(定义、作用、通用装饰器、多个装饰器、带参数的装饰器、类装饰器、装饰器方式添加WEB框架的路由)

    一.闭包的介绍 闭包可以保存函数内的变量 当闭包执行完毕,外部函数的变量才释放. # 闭包的作用:可以保存外部函数的变量 # 闭包的形成条件 # 1.函数嵌套 # 2.内部函数使用了外部函数的变量或者 ...

最新文章

  1. 深度学习-我们为什么需要BN(Batch Normalization)?
  2. 走在网页游戏开发的路上(六)
  3. 前端模板引擎Thymeleaf快速入门
  4. go 结构体排序的几种方法
  5. java 滚动加载,滚动加载,可视区域判断
  6. RTMP协议中文翻译(首发)(转)
  7. 122. 买卖股票的最佳时机 II golang
  8. matlab实现prim算法,Prim算法和Kruskal算法的Matlab实现
  9. ASP.NET Core 使用 Hangfire 定时任务
  10. android 自定义加载动画效果,Android自定义加载动画-旋转的叶子
  11. Eclipse、Tomcat安装配置及部署教程
  12. 弹簧振子串联matlab,关于串联弹簧振子的研究
  13. DevOps工具图谱分析(一)
  14. python nextpow2_Python signal.hann方法代码示例
  15. Effective Java 类和接口 第17条:要么为继承而设计,并提供文档说明,要么就禁止继承
  16. 如何下载旧版本R和R包?
  17. MongoDB可视化工具 Studio 3T
  18. python的tesseract库几个重要的命令
  19. 在Ubuntu 18.04上用源码安装GVM 20.08
  20. jQuery设置attr()对样式属性失效的原因

热门文章

  1. MySQL模拟Oralce闪回操作
  2. NSTimer与Run loop Modes
  3. Response.Redirect() 跳转中的ThreadAbortException
  4. day03-正则表达式
  5. Python中的正则
  6. 在Mac终端下使用conda命令提示未找到命令conda
  7. 近期学习的原生JS知识以及jQuery框架
  8. 13---Net基础加强
  9. 暑期项目经验(十)--struts + poi
  10. MyEclipse 6.5 快捷键