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,执行对应不同的功能
反射还可以用于动态导入模块 :
欢迎关注公众号数据爱好者,所有知识点公众号首推,不定时更新数据处理小知识欢迎来学习!