MicroPython中const()定义的受保护类变量为何不在类成员列表中?
问题:为何被MicroPython const()赋值的受保护类变量未出现在类成员列表中?
根据MicroPython官方文档说明,“以下划线开头的常量会被隐藏”——这是否意味着它被完全从程序中移除了?
示例代码
from micropython import const class Device: class_variable_1 = const(1) _class_variable_2 = const(2) print(dir(Device))
运行结果
['__class__', '__module__', '__name__', '__qualname__', '__bases__', '__dict__', 'class_variable_1']
解答
带下划线的const常量没有被完全移除,只是MicroPython对它做了特殊优化处理,导致它不在dir()的输出和类的属性列表中显示,但代码里依然可以正常访问使用。
具体细节:
const()是MicroPython的编译器优化工具,它会把常量值直接替换到代码中所有引用该变量的位置,减少运行时的内存占用和属性查找开销。- 对于以下划线开头的
const变量,MicroPython会额外执行“隐藏”逻辑:不将其注册到类的属性字典(__dict__)中,因此dir()无法枚举到它,但编译器会保留对这个变量名的识别,直接替换为对应的值。
验证一下直接访问的有效性:
from micropython import const class Device: class_variable_1 = const(1) _class_variable_2 = const(2) print(Device._class_variable_2) # 输出:2
这种设计的核心原因:
- 契合Python的命名规范,下划线开头的成员表示“受保护”,不建议外部随意访问;
- 最大化优化内存和运行效率,既然
const()已经把值硬编码到代码里,就没必要再在类属性中存储额外的引用; - 避免不必要的属性查找操作,让代码运行更快。
内容的提问来源于stack exchange,提问作者PaszaVonPomiot
相关产品推荐
相关产品推荐

