# 反射:用过字符串的形式操作对象成员(python中一切皆为对象,所以也可以操作类,模块)
"""
1、getattr(obj, str),去obj对象获取str属性,义字符串的形式取对象中的成员(字段,方法)
2、hasattr(obj, str)检测obj对象中有没有str成员,返回值True或False
3、setattr(obj, key, value),设置obj对象成员,key=value
4、delattr(obj, str)删除obj对象成员
"""
# 示例1.操作示例对象
class Foo1:
def __init__(self, name, age):
self.name = name
self.age = age
def bar(self):
return self.name
foo1 = Foo1('abc', '18')
# 我们可以通过getattr来取值,getattr(foo1, b)表示我要在对象中取变量b的值(name)对应的字段
# 这样就可以实现一个简单的交互,通过用户输入的信息,查找对象字段
b = 'name'
print(getattr(foo1, b))
inp = input('请输入要查询的字段:') # 需要输入对象成员名称,如果没有该成员会报错,使用try捕获异常
try:
print(getattr(foo1, inp))
except Exception as e:
print('查找的对象不存在')
# 通过getattr取出对象方法
fun = getattr(foo1, 'bar')
print(fun())
# 通过hasattr判断对象中是否存在该成员,返回true或者False
print(hasattr(foo1, 'name'))
print(hasattr(foo1, 'abc'))
# 通过设置对象成员
setattr(foo1, 'abc', '123')
# print(foo1.abc)
# 通过delattr删除对象成员,删除后取值会报错,通过try处理异常
delattr(foo1, 'name')
try:
print(foo1.name)
except Exception as e:
print(e)
# 示例2、操作类
class Foo2:
name = 'abc'
age = '18'
pass
# 取值
print(getattr(Foo2, 'name'))
# 判断是否存在
print(hasattr(Foo2, 'name'))
print(hasattr(Foo2, 'abc'))
# 设置
setattr(Foo2, 'abc', '123')
print(Foo2.abc)
# 删除,删除后取值会报错,通过try处理异常
delattr(Foo2, 'name')
try:
print(Foo2.name)
except Exception as e:
print(e)