什么是反射
反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。
下面是反射的四个基本方法:
- getattr 获取指定字符串名称的对象属性
- setattr 为对象设置一个对象
- hasattr 判断对象是否有对应的对象(字符串)
- delattr 删除指定属性
使用
在test.py中创建三个函数
复制代码
1
2
3
4
5
6
7
8
9def A(): print('我是A') def B(): print('我是B') def C(): print('我是C')
在同级目录下的testtest.py中导入
复制代码
1
2
3
4
5
6import test as H H.A() H.B() H.C()
很普通的调用方法肯定没有问题执行结果:
复制代码
1
2
3
4我是A 我是B 我是C
需求一:想要用户输入模块进行调用方法
使用__import__(模块名) 就可以根据字符串来寻找相应的模块并导入
复制代码
1
2
3
4
5
6
7input = input('请输入导入的模块名') H = __import__(input) H.A() H.B() H.C()
执行结果:
复制代码
1
2
3
4
5请输入导入的模块名test 我是A 我是B 我是C
需求二:现在还想输入方法名来,调用相应的方法
这时候呢就可以用到反射函数中的getattr 来根据字符串来获取相应的方法
复制代码
1
2
3
4
5
6
7he = input('请输入导入的模块名') H = __import__(he) method = input('请输入模块名') getattr(H,method)() # getattr() # 参数一 去找的模块 参数二 去找的方法名
判断输入的是否是模块中具有的
复制代码
1
2
3
4
5
6
7
8
9
10he = input('请输入导入的模块名') H = __import__(he) method = input('请输入模块名') if hasattr(H,method): getattr(H,method)() else: print('404') # hasattr 参数一 去找的模块 参数二 去找的方法
打印结果
复制代码
1
2
3
4请输入导入的模块名test 请输入模块名D 404
给模块中添加相应方法
复制代码
1
2
3
4
5
6
7
8
9
10
11he = input('请输入导入的模块名') H = __import__(he) method = input('请输入模块名') setattr(H,method,lambda :print('我是D')) if hasattr(H,method): getattr(H,method)() else: print('404') # setattr 参数一 去找的模块 参数二 方法名 参数三 方法
打印结果
复制代码
1
2
3
4请输入导入的模块名test 请输入模块名D 我是D
删除模块中的相应的方法
复制代码
1
2
3
4
5
6
7
8
9
10
11he = input('请输入导入的模块名') H = __import__(he) method = input('请输入模块名') setattr(H,method,lambda :print('我是D')) delattr(H,method) if hasattr(H,method): getattr(H,method)() else: print('404')
打印结果:
复制代码
1
2
3
4请输入导入的模块名test 请输入模块名D 404
1----getattr():
作用: 去指定对象中去寻找相应的方法
2----hasattr():
作用:判断指定对象中是否含有指定成员,有则返回True,否则返回False。
3----setattr():
作用:给指定对象添加指定成员
4----delattr():
作用:删除指定对象中的指定成员
总结
简单来说就是你可以利用字符串来映射模块中的相应方法然后可以操作模块中相应的方法。(个人理解)
参考链接:https://www.cnblogs.com/rexcheny/p/9498091.html
最后
以上就是调皮野狼最近收集整理的关于python的反射概念、理解和基本使用的全部内容,更多相关python内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复