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))
View Code

  执行结果如下 :

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
View Code

 

  对类操作,示例代码如下:

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))
View Code

  执行结果如下:

通过类获取类属性值  游泳
通过实例获取类属性值  游泳

Process finished with exit code 0
View Code

 

posted @ 2021-08-02 09:33  空-山-新-雨  阅读(55)  评论(0编辑  收藏  举报