007、面向对象(四)、动态获取属性,反射机制
1、反射机制
参考资料:https://cloud.tencent.com/developer/article/1173302
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。
利用字符串的形式去类 、对象(模块)中 动态 操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动 。
a、hasattr (类/对象,属性) # 类 / 对象, 是否有某个属性
b、setattr (类/对象,属性) # 给类 / 对象,设置某个属性 (有则修改,无则添加)
c、getattr (类/对象,属性) # 读取类/对象 某个属性值
d、delattr (类/对象,属性) # 删除类/对象 某个属性
对实例操作, 示例代码如下 :
# ######### 反射机制 ############# # hasattr(类/对象,属性) # 类 / 对象, 是否有某个属性 # setattr() # 给类 / 对象,设置某个属性(有则修改,无则添加) # getattr() # 读取类/对象 某个属性值 # delattr() # 删除类/对象 某个属性 class Person(): def __init__(self, name): self.name = name p = Person('sky') # # 设置属性之前获取属性值, # # 会报错 AttributeError: 'Person' object has no attribute 'hobby' # value = getattr(p, 'hobby') # print('setattr之前{0}'.format(value)) # 如果sky没有hobby这个属性,就给他添加一个 # 如果把实例p改成 Person,则是给类添加属性,对类的操作 ; # if not hasattr(Person, 'hobby'): # setattr(Person, 'hobby', '游泳') if not hasattr(p, 'hobby'): setattr(p, 'hobby', '游泳') # 设置属性之后获取属性值,可以获取 ; value = getattr(p, 'hobby') print('setattr之后 {0}'.format(value)) # 删除 hobby属性 delattr(p, 'hobby') # # 删除之后再去获取的话,会报错; # # AttributeError: 'Person' object has no attribute 'hobby' # value = getattr(p, 'hobby') # print('setattr之后 {0}'.format(value))
执行结果如下 :
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_06.py
setattr之后 游泳
Process finished with exit code 0
对类操作,示例代码如下:
class Person(): def __init__(self, name): self.name = name p = Person('sky') # 设置类属性,给 Person 设置类属性 ; if not hasattr(Person, 'hobby'): setattr(Person, 'hobby', '游泳') # 通过类获取类属性值 value_1 = getattr(Person, 'hobby') print('通过类获取类属性值 {0}'.format(value_1)) # 通过实例获取类属性值 value_2 = getattr(p, 'hobby') print('通过实例获取类属性值 {0}'.format(value_2)) # 删除 类属性: hobby属性 delattr(Person, 'hobby') # # # 删除之后再去获取的话,会报错; # # AttributeError: type object 'Person' has no attribute 'hobby' # # 通过类获取类属性值 # value_3 = getattr(Person, 'hobby') # print('通过类获取类属性值 {0}'.format(value_3)) # # # 通过实例获取类属性值 # value_4 = getattr(p, 'hobby') # print('通过实例获取类属性值 {0}'.format(value_4))
执行结果如下:
通过类获取类属性值 游泳
通过实例获取类属性值 游泳
Process finished with exit code 0