首页
学习
活动
专区
圈层
工具
发布
30 篇文章

八、python学习笔记-面向对象-反射

代码语言:javascript
复制
# 反射:用过字符串的形式操作对象成员(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)
下一篇
举报
领券