反射

反射:通过字符串映射到对象的属性

反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr  获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子:

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

    def talk(self):
        print('%s is talking' % self.name)


obj = People('alex', 18)

# print(obj.name)  # ==obj.__dict__['name']
# print(obj.talk())
print(hasattr(obj, 'talk'))  # hasattr就是用来判定给出的对象中有没有这个属性,有则返回True,反之返回False
print(getattr(obj, 'name', None))  # getattr(o,name,default)参数o:给定的对象。参数name:是要获取的属性。参数default:是发生问题是给出结局方案
#  当default = None时,如果要获取的属性不存在。该命令并不会报错
setattr(obj, 'name', 'wang') #obj.name = 'wang'
print(obj.name)
delattr(obj, 'name')
print(getattr(obj, 'name', None))

结果:

True
alex
wang
None

 

反射的使用:

根据上面的程序稍作修改

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

    def run(self):
        while True:
            inp = input('>>>:').strip() #cmd='talk 1.txt
            cmd=inp.split()[0]
            if hasattr(self, cmd):
                func = getattr(self, cmd)
                func()

    def talk(self):
        print('%s is talking' % self.name)


obj = People('alex', 18)
obj.run()

结果:

>>>:talk
alex is talking
>>>:

总结分析:可以看出,输入命令后。hasattr判断talk是否存在,如果存在就执行getattr结果返回func,接着运行func()其实就是运行的talk()。

 

posted @ 2018-06-04 16:48  笃行1995  阅读(98)  评论(0编辑  收藏  举报