python中的反射特性getattr、setattr,hasattr和delattr

class Foo:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):  # __str__特殊成员函数,是打印类的实例对象时所返回的值
        s = ''
        for name, value in vars(self).items():
            # vars方法,是将对象的所有成员的名值对以字典的形式返回,这里借用vars函数,实现以动态的形式返回对象所有成员
            # 因为demo中有演示增加和删除成员的动作
            if s == '':
                s = f'{name}:{value}'
            else:
                s = ''.join([s, f',{name}:{value}'])
        return s

    def age_grow(self, years):
        self.age += years


obj = Foo('张三', 18)
print(obj)  # name:张三,age:18
func = getattr(obj, 'age_grow')  # getattr(对象,对象成员的名字)利用反射,获取对象的成员,这里是把对象的age_grow方法赋予给了func变量,此时func变量具有了函数的作用
func(6)  # 年龄增加了6岁,obj.age的值变成了24
print(obj)  # name:张三,age:24
setattr(obj, 'sex', '')  # setattr(对象, 成员名字, 赋的值)利用反射,设置或增加了一个成员属性,赋值sex,这里是增加了一个sex成员(因为并没有这个成员,则是增加),赋值为男
if hasattr(obj, 'sex'):  # 检查对象是否拥有某个成员,返回bool值
    print('Yes')
else:
    print('No')
print(obj)  # name:张三,age:24,sex:男
delattr(obj, 'sex')  # 删除对象中某个成员
print(obj)  # name:张三,age:24

 

posted @ 2021-09-21 21:42  张永谊  阅读(113)  评论(0)    收藏  举报