反射
反射:通过字符串映射到对象的属性
反射即想到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()。