Python中不存在以#开头的私有字段,#仅为注释符号;真正的私有约定仅用单下划线(_name)表示受保护、双下划线(__name)触发名称修饰,且均不涉及#。

Python 中没有以 # 开头的私有字段命名规则,# 是 Python 的行内注释符号,不是变量或属性名的合法组成部分。
你提到的“私有字段(#)”,很可能存在误解:# 在 Python 中永远不能出现在标识符(如变量名、属性名、方法名)中。
例如,以下写法全部非法,会直接报 SyntaxError:
self.#value = 10 # ❌ 语法错误
obj.#data # ❌
class MyClass:
def __init__(self):
self.#private = 42 # ❌Python 解析器遇到 # 会立即将其后所有内容视为注释,直到行尾;它不参与变量定义或命名,更不构成“私有字段”的语法机制。
✅ Python 真正用于表示“私有性”的命名约定只有以下三种(均不使用 #):
_name(单下划线开头)
- 表示“受保护”(protected),是约定俗成的私有提示
- 外部仍可访问(如
obj._name),但 IDE 不提示、from module import *不导入 - 作用:告诉协作者“请勿直接使用,这是内部实现”
__name(双下划线开头,非结尾)
- 触发名称修饰(name mangling):自动重命名为
_ClassName__name - 目的是避免子类意外覆盖,不是为了绝对禁止访问
- 仍可通过
obj._ClassName__name访问(不推荐,破坏封装)
__name__(双下划线开头 + 双下划线结尾)
- 属于特殊方法(dunder method),如
__init__、__str__ - 是 Python 内置协议的一部分,与私有性无关,严禁用户自定义类似命名
❓为什么有人误以为要加 #?
可能源于以下混淆:
- 把注释
# private field当作命名一部分(如# _id→ 误读为#_id) - 混淆了其他语言(如 C# 的
#region或 TypeScript 的#privateField语法) - 编辑器高亮或文档标记(如 Markdown 中用
#表示标题)被误当作代码语法
⚠️ 注意:Python 3.8+ 引入了真正的私有成员语法 —— 但用的是
#吗?不。
实际上,Python 至今(2026年)仍未引入#field这类私有字段语法。
(注:TypeScript、Rust、C# 等语言有#私有字段,但 Python 没有,也不在 PEP 提案中)
✅ 正确做法:用下划线,不用 #
| 意图 | 推荐写法 | 说明 |
|---|---|---|
| 内部使用、不对外暴露 | _internal_id |
遵守 PEP 8,团队共识 |
| 强隔离、防子类覆盖 | __balance |
自动变为 _Account__balance
|
| 特殊方法(不要模仿) | __len__ |
仅用于实现协议,勿自创 |
不复杂但容易忽略:
私有性靠的是命名约定 + 开发者自律 + 工具辅助(如 PyCharm 警告、mypy 检查),而不是语法强制。# 在这里,只是安静地写着注释而已。

















