反射

来源:互联网 发布:剑灵人男捏脸数据截图 编辑:程序博客网 时间:2024/06/07 09:05

点方法访问属性的本质:
obj.attr >>> obj.__dict__[‘attr’]
本质是到对象的名称空间,通过属性的字符串名字来找。

通过字符串操作属性,就是反射。
python提供了通过字符串操作对象属性的方法(tips: python中一切皆对象):
1. hasattr(obj, ‘attr’) 判断属性,返回True/False
2. getattr(obj, ‘attr’, ‘xxx’) 获取属性,获取失败则返回’xxx’信息。如果未指定第三个参数,获取失败就报错。
3. setattr(obj, ‘attr’) 设置属性
4. delattr(obj, ‘attr’) 删除属性

用户的输入是字符串类型,因此反射适合用户交互的场景:

class Cmd():    def ls(self):        print('ls function')    def cat(self):        print('cat function')    def pwd(self):        print('pwd function')    def run(self):        while True:            cmd = input('>>> ')            if not cmd:continue            if hasattr(self,cmd):   # 判断用户输入的属性是否存在                getattr(self,cmd)()    # 获取属性并执行            else:                print('invalid cmd')c = Cmd()c.run()