python反射

什么是反射?

这是摘自维基百科的解释

在计算机学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。

和反射还有一个很相似的机制:自省

很多人可能觉得反射和自省是一样的,但是反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序状态或结构。

我理解的反射

就是我们不知道这个程序有什么功能时,让程序反过来告诉我们它有什么功能。所以反射可以用于实现在运行时获取未知对象的信息。让程序告诉我们自己有什么功能这听起来似乎有点诡异。

在一般的编程语言里反射相对其他概念来说稍显复杂,一般来说都是作为高级主题来讲;但在Python中反射非常简单,用起来几乎感觉不到与其他的代码有区别,使用反射获取到的函数和方法可以像平常一样加上括号直接调用,获取到类后可以直接构造实例;不过获取到的字段不能直接赋值,因为拿到的其实是另一个指向同一个地方的引用,赋值只能改变当前的这个引用而已。

使用反射

反射基本方法

python3的反射主要通过四种基本方法解析:

getattr()方法

hasattr()方法

setattr()方法

delattr()方法

下面这是反射的例子:

hasattr()

示例:hasattr(cat, "name"),第一个参数是对象,第二个参数是属性或者方法的名字

hasattr()方法是判断类方法或者类属性是否存在,返回一个布尔值。如果存在该属性或者方法返回True,反之返回Flase

getattr()

示例:getattr(cat, "name"),第一个参数是对象,第二个参数是属性或者方法的名字

getattr()方法是用于获取属性值或实例方法,如果属性的值或者方法不存在时会抛出一个异常AttributeError: 'Cat' object has no attribute 'aaa'。

通过getattr() 方法获取到的类方法可以直接加上括号()进行调用

setattr()

示例:setattr(cat, "name","tiger"),第一个参数是对象,第二个参数是对象属性的名字,第三个参数是属性的值

setattr()方法用于设置实例属性的值,如果实例属性不存在时,会自动给当前实例添加该属性

delattr()

示例:delattr(cat, "name"),第一个参数是对象,第二个参数是属性或者方法的名字

delattr()方法用于删除实例的属性或者实例的方法,当实例属性或者实例方法不存在时同样会抛出一个AttributeError异常

反射的特点

优点

支持反射的语言提供了一些在早期高级语言中难以实现的运行时特性。

可以在一定程度上避免硬编码,提供灵活性和通用性。

可以作为一个第一类对象发现并修改源代码的结构(如代码块、类、方法、协议等)。

可以在运行时像对待源代码语句一样动态解析字符串中可执行的代码(类似JavaScript的eval()函数),进而可将跟class或function匹配的字符串转换成class或function的调用或引用。

可以创建一个新的语言字节码解释器来给编程结构一个新的意义或用途。

劣势

此技术的学习成本高。面向反射的编程需要较多的高级知识,包括框架、关系映射和对象交互,以实现更通用的代码执行。

同样因为反射的概念和语法都比较抽象,过多地滥用反射技术会使得代码难以被其他人读懂,不利于合作与交流。

通过深入学习反射的特性和技巧,它的劣势可以尽量避免,但这需要许多时间和经验的积累。

反射的应用

最后说一下反射的应用吧,反射主要根据字符串去寻找类的属性值,主要用于用户交互,触发类内函数运行,根据字符串动态的判断,调用,添加/修改,删除类或类的实例化对象中的方法或属性。

反射在web框架中用的很多,通过解析url,执行对应不同的功能

反射还可以用于动态导入模块 :

欢迎关注公众号数据爱好者,所有知识点公众号首推,不定时更新数据处理小知识欢迎来学习!

python反射机制_Python反射机制相关推荐

  1. python加载机制_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  2. python的锁机制_python锁机制

    python 多线程 真正的多线程吗? 对于多核处理器,在同一时间确实可以多个线程独立运行,但在Python中确不是这样的了.原因在于,python虚拟机中引入了GIL这一概念.GIL(Global ...

  3. python包管理机制_Python 包机制 - osc_8wyy9cyu的个人空间 - OSCHINA - 中文开源技术交流社区...

    Python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sys.path中增加事先写好的 ...

  4. python机制_python异常机制个人理解(参考网上资料)

    当你的程序中出现异常情况时就需要异常处理.比如当你打开一个不存在的文件时.当你的程序中有一些无效的语句时,Python会提示你有错误存在. 下面是一个拼写错误的例子,print写成了Print.Pyt ...

  5. python getattr用法_python 反射之getattr用法

    In [1]: models import CompanyTenant # 导入模型表In [2]: tenant = getattr(CompanyTenant,'tenant_id','') # ...

  6. python的几种重要机制(垃圾回收机制,猴子补丁,反射机制,自省机制)

    python垃圾回收机制 垃圾回收机制要解决的问题 内存泄漏 悬空指针 引用计数 定义 环形链表中所存放数据的相同点和不同点 无法解决循环引用问题 标记清除 原理: 存在查找活动对象效率低下的问题 隔 ...

  7. JAVA基础 (二)反射 深入解析反射机制

    在谈论到反射这个问题时,你是否有例如以下疑问? 不管是在.NET还是Java中反射的原理和机制是一样的,理解了一种还有一种就能够迎刃而解,想要理解反射首先须要了解底层的一些概念和执行.理解了反射有助于 ...

  8. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  9. 【Java】反射( reflection)机制 详解

    目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...

最新文章

  1. java接口有非抽象方法_[Java教程]纳尼,java可以在接口中实现非抽象方法了?
  2. 重磅新作!预训练语言模型入门必读好书 | 送书福利
  3. 超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享...
  4. 【JS 逆向百例】转变思路,少走弯路,X米加密分析
  5. 编写高质量代码的50条黄金守则-Day 01(首选隐式类型转换)
  6. matlab语音去除白噪声_全国首款“AI语音电梯”亮相海淀医院、北医三院
  7. jquery 读取checkbox
  8. 面试官:Spring该选择哪个构造方法来进行实例化?画重点要考的
  9. sqlserver 调优(三)
  10. javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据...
  11. wordpress配置HTTPS遇到问题解决方案
  12. ISCC2021-WP合集
  13. Typora自动生成标题编号(包含从二级标题开始的)
  14. Kubernetes的Startup, Liveness, Readiness深入探索
  15. keil中 如何解决warning L13:Recursive call to Function 及overlay解释
  16. python计算三角形的周长和面积
  17. java生成不重复8位数字_如何生成8位随机不重复的数字编号
  18. ACM2023SWJTU寒假选拔赛2不完全题解
  19. [Web] [微信小程序-云开发] 商城 无服务器 加后台管理
  20. VMware虚拟机中linux CentOS7上网联网,简单粗暴亲测有效

热门文章

  1. 金庸武功之“蛤蟆功”--memcached主从复制
  2. 基于GPS和INS组合导航软硬件系统设计
  3. 浅尝超融合之Nutanix(下)安装篇
  4. 关于java项目中的.project文件:
  5. 某剧院有33排座位java_2018国考行测数学题“拍档”:等差数列和等比数列
  6. 谷歌地图下载_拔剑-浆糊的传说_新浪博客
  7. 区块链中的密码学系列之SHA256算法(三)
  8. 零基础自学R语言 1 R语言介绍 1.4 基本R软件的用法
  9. 一小时入门 Python 3 网络爬虫
  10. mencoder合并视频