You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

这种设计的核心原因:

  1. 契合Python的命名规范,下划线开头的成员表示“受保护”,不建议外部随意访问;
  2. 最大化优化内存和运行效率,既然const()已经把值硬编码到代码里,就没必要再在类属性中存储额外的引用;
  3. 避免不必要的属性查找操作,让代码运行更快。

内容的提问来源于stack exchange,提问作者PaszaVonPomiot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:25:01