1. Python中提供了4个内置函数来支持反射
- getattr,去对象中获取成员
v1 = getattr(对象, '成员名称') v2 = getattr(对象, '成员名称', 不存在时的默认值)
- setattr,去对象中设置成员
setattr(对象, '成员名称', 值)
- hasattr,对象中是否包含成员
v1 = hasattr(对象, '成员名称') # True/False
- delattr,删除对象中的成员
delattr(对象, '成员名称')
2. Python中一切皆对象,每个对象内部都有自己维护的成员
- 实例化的对象是对象
- 类是对象(底层实现原理也是对象,只是开发中通常称为类而不称对象)
- 模块是对象,例如:
import re """ re模块也是一个对象,但平时不这么称呼 """ re.match
- 简单粗暴:只要看到xx.y都可以用反射来实现
3. import_module + 反射
- 导入模块可以通过import直接导入,也可以通过字符串形式导入,示例:
""" 普通导入 """ import random v1 = random.randint(1, 100)
示例二:""" 反射 """ from importlib import import_module m = import_module('random') v1 = m.randint(1, 100)
示例三:# from requests import exception as m from importlib import import_module m = import_module('requests.exceptions')
# from requests.exceptions import InvalidURL from importlib import import_module """错误方式 m = import_module('requests.exceptions.InvalidURL') # 报错,import_module只能导入到模块级别 """ """ 正确方法 """ m = import_module('requests.exceptions') cls = m.InvalidURL # 去模块中获取类