numpy中Tester类未在__dict__中却被dir()和getmembers()检测到的问题
numpy模块
Tester类相关问题解答 1. numpy隐藏Tester类的机制
numpy采用**延迟加载+模块级__getattr__**的机制实现这种效果:
Tester类并未提前导入并存入numpy.__dict__;- 当你首次访问
numpy.Tester时,Python会触发模块的__getattr__方法,numpy在这个方法内部动态导入Tester类并返回; - 这种设计既减少了numpy启动时的资源开销,又能让用户按需访问该类,同时因为它不在模块的
__dict__里,就会出现你观察到的“存在但不在__dict__”的现象。
2. dir()和inspect.getmembers()获取Tester引用的来源
这两个工具的枚举逻辑依赖模块的__dir__方法:
- numpy自定义了模块级的
__dir__方法,主动将Tester这类延迟加载的对象名称加入返回的名称列表,所以dir(numpy)能列出Tester; inspect.getmembers()枚举模块成员时,会先通过dir()获取成员名称列表,再逐一解析这些名称对应的对象,因此也能获取到Tester类的引用。
内容的提问来源于stack exchange,提问作者user3435121
相关产品推荐
相关产品推荐

