1、 反射的概念
反射主要应用于类的对象上,在运行时,将对象中的属性和方法反射出来,通过字符串对对象成员(属性、方法)进行查找、获取、删除、添加成员等动作,是一种基于字符串的事件驱动技术。
2、 反射的主要内容
反射的内容包括但不限于如下内容:
反射类中成员
反射对象中的成员
反射模块中的成员
对应 python 里的反射有下面四种常见方法:
方法 | 用法 |
hasattr(obj,name_str) | 判断输入的name_str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False。 |
getattr(obj,name_str) | 将按照输入的name_str字符串在对象obj中查找,如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用;如果未能找到同名的属性或者方法,则抛出异常:AttributeError。 |
setattr(obj,name_str,value) | name_str为属性名或者方法名,value为属性值或者方法的引用。 |
delattr(obj,name_str) | 将你输入的字符串name_str在对象obj中查找,如找到同名属性或者方法就进行删除。 |
3、hasattr() getattr() setattr()delattr()的用法
3.1 hasattr()
hasattr(object, name)
检查对象(类)的属性是否存在,属性存在返回True,否则返回False。
3.2 getattr()
getattr(object, name[, default])
获取对象(类)的属性,返回对象指定的属性值,不存在返回设置的默认值,不设置默认值时得不到属性值会报错
#创建类
class main:
a = 1
b = 2
c = 3
def run(self):
print(123)
#实例化对象
o = main()
#获取并打印已存在的属性:'c'
print(getattr(o, 'c'))
#结果:3
#获取并打印不存在的属性:'d'
print(getattr(o, 'd', '这是默认值'))
#结果:这是默认值
#由于d属性不存在,所以使用了设置的默认值。
#尝试获取对象的方法
print(getattr(o, 'run'))
#结果:由尖括号括起来的方法标识,一般不用getattr()获取方法。
3.3 setattr()
添加对象(类)的属性
setattr(object, name, value)
第一个参数是一个对象,第二个参数是属性的名称(该名称可以是已经存在的属性也可以是不存在的属性),第三个参数是属性的值(可以是任意值),如果第二个参数的属性名是对象已存在的属性,则会覆盖原属性的值,如果是不存在的属性名称,则会新增属性到对象中。例如,setattr(o,'new',123)等效于o.new = 123。
#创建类
class main:
a = 1
b = 2
def run(self):
print(123)
#实例化类
o = main()
#新增属性C
setattr(o, 'c', 5)
#打印新输出
print(o.c)
#输出结果:5
#需要注意,不仅填写的已存在的属性名称会覆盖已有属性的值。填写了已存在的方法名称,也会覆盖这个方法的。在一些比较严格的情况下,尽量先检查属性的类型或者是否已经存在。
setattr(o, 'run', 10)
print(o.run)
#输出结果:10
3.4 delattr()
delattr(object, name)
删除对象(类)的属性,不存在则会报错,不允许删除对象方法