惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
P
Privacy International News Feed
T
Tenable Blog
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
S
Securelist
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
月光博客
月光博客
T
The Blog of Author Tim Ferriss
Scott Helme
Scott Helme
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
C
Cisco Blogs
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
T
Tor Project blog
Security Latest
Security Latest
Blog — PlanetScale
Blog — PlanetScale
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
博客园 - 三生石上(FineUI控件)
I
InfoQ
Spread Privacy
Spread Privacy
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
C
CERT Recently Published Vulnerability Notes
A
About on SuperTechFans
博客园_首页
Engineering at Meta
Engineering at Meta
Project Zero
Project Zero
Latest news
Latest news

博客园 - 箫笛

Tkinter - Entry 输入框组件 Tkinter - Button 组件 Tkinter - Label 组件 Tkinter - tk 变量 Tkinter - 事件与绑定 Tkinter - 几何管理器 Tkinter - 核心概念 Tkinter - 快速开始 Tkinter - 介绍 Python 编程 - 条件表达式 Python 编程 - 星号下划线参数释义 shell 编程 - shell 脚本的交互方式 Python insall - macOS 系统安装python的几种方式 Miniconda - Python 环境管理工具 Tkinter - Python GUI 开发 Python 编程 - 元类编程 Python 编程 - 多重继承与MRO Python 编程 - 描述符协议 Python 编程 - 类型注解 Python 编程 - 生成器表达式 Python 编程 - 集合 Python 编程 - 装饰器 Python 编程 - 闭包 Python 编程 - 列表推导式 Python 编程 - 函数式编程 Python 编程 - lambda 函数 Python 编程 - 文件操作 Python 编程 - 输入与输出 Python 编程 - 面向对象编程 Python 编程 - 元组(tuple) Python 编程 - 字符串(str) Python 编程 - 字典(dict) Python 编程 - 列表(list) Python 编程 - 数据类型和数据结构 Python 编程 - 语句 Python 编程 - 函数 windows - WSL 的安装与使用 shell编程 - dialog 程序使用指南 FE Team - 如何做好前端代码审查 git 提交的撤销和恢复 React15 - redux-saga 如何在saga中实现轮询接口调用? React15 - React CSS Modules BEM命名实践 React15 - React 15 中 componentWillReceiveProps 为什么会多次调用, 同时componentDidUpdate 也会多次调用? React15 - React15类组件多次执行render方法的原因? React15 - React15应用中代码逻辑复用方案 React15 - React状态同步问题解决 React15 - React 15 中 React.pureComponent 的使用场景 React15 - React 15应用在页面渲染时会多次执行类组件的render 函数的原因 React15 - React 15 中能用 componetDidUpdate 代替 componentWillReceiveProps 吗? React15 - React 15 生命周期函数详解 React15 - 如何在React 15中实现自定义的事件订阅与发送(例如组件间通信) React15 - React15应用中的事件订阅和发送机制 React15 - CSS中的BEM规范 React15 - React CSS Modules BEM命名实践 React15 - 写sass 样式文件,嵌套的结构好,还是扁平的结构好? React15 - sass 中 @mixin 和 @extend 的区别是什么? React15 - React 15 应用 如何使用Css moudules 方式进行模块化开发 React15 - React15应用Sass使用指南 React15 - React 15 应用如何进行性能优化?
Python 编程 - 下划线命名的区别
箫笛 · 2026-07-03 · via 博客园 - 箫笛

在Python中,单下划线(_)和双下划线(__)开头的命名,核心区别在于:单下划线是一种“约定”,而双下划线是一种“机制”

前者是给程序员看的提示,后者是Python解释器会实际执行的规则。

单下划线开头 _var:一种“内部使用”的约定

这是一种广泛遵守的编码规范,由PEP 8定义。它主要起提示作用,解释器本身不会强制执行任何访问限制。

  • 含义:告诉其他开发者,这个属性或方法是“内部的”或“非公开的”(protected),属于实现细节,不应在外部直接使用。这有助于保持代码的稳定性和可维护性。
  • 实际效果
    • 访问上不受限:你仍然可以访问它,但这样做被认为是不好的编程习惯。
    • 导入时被忽略:当你使用 from module import * 时,以单下划线开头的名称不会被导入
  • 使用场景
    • 类的“保护”成员。
    • 模块内部的函数或变量。
    • 作为循环中的临时变量或占位符。

双下划线开头 __var:一种“名称修饰”的机制

这并非用于实现“私有”属性,而是Python解释器执行的一种“名称修饰”(Name Mangling)技术。

  • 含义:主要用于防止在继承时子类意外覆盖(override)父类的属性或方法。它不是为了防止外部访问,而是为了避免在复杂的继承体系中发生命名冲突。
  • 机制与效果
    • 名称被改写:在类定义内部,所有以双下划线开头的名称,都会被Python解释器自动重命名,格式为 _ClassName__var
    • 访问需通过修饰名:因此,你不能直接通过 obj.__var 访问,但可以通过 obj._ClassName__var 访问到。这也证明了它并非真正的私有。
  • 使用场景:当你明确知道你的类会被广泛继承,并且有一些内部属性绝对不应该被子类覆盖时,才考虑使用。

特殊情况:双下划线开头和结尾 __var__

这是Python官方预留的“特殊方法”或“魔法方法”命名模式。例如__init__(构造函数)、__str__等。请绝对不要在自己的代码中创造这种名字,它仅供Python内部使用。

总结对比

特性 单下划线 (_var) 双下划线 (__var)
本质 编码约定 (Convention) 名称修饰机制 (Name Mangling)
主要目的 提示“内部使用”,不建议外部访问 防止子类意外覆盖,避免命名冲突
访问控制 ,解释器不强制执行 ,名称被改写,需通过修饰名访问
继承行为 子类可以轻松覆盖 子类中同名属性会被修饰为不同名称,互不干扰
导入行为 from module import *不会被导入 无特殊影响
推荐程度 推荐,用于标识内部实现 谨慎使用,仅在防止子类覆盖时考虑

最佳实践建议

Python的哲学是“我们大家都是成年人”。它相信程序员会自觉遵守约定,而不是通过强制的语法来限制。

  1. 默认使用单下划线:对于大多数“非公共”的属性和方法,使用单下划线 _var 是更普遍和推荐的做法。
  2. 按需使用双下划线:仅在你有明确需求,必须防止子类覆盖某些关键内部属性时,才考虑使用双下划线 __var

理解并遵循这些约定,是写出地道、专业且易于维护的Python代码的重要一步。