一文详解Python中的单下划线_ 、双下划线__

 更新时间:2026年03月18日 09:27:50   作者:GeekPMAlex  
在Python开发中,单下划线(_)和双下划线(__)作为命名修饰符,承担着不同的语义和功能,它们不仅是代码规范的组成部分,更是实现模块化、封装性和特殊行为的关键工具,这篇文章主要介绍了Python中单下划线_ 、双下划线__的相关资料,需要的朋友可以参考下

很多人从Go/Java转Python的同学会疑惑

为什么python类的默认构造函数是 init? 不是__init 不是init__ 或者_init_ ?

其实是因为python的语法导致的。Python 里面没有pubcli private,甚至默认所有的类的属性都是公开的。让我们回想一下 **Python 的“访问控制”哲学: “We are all consenting adults.”(我们都是有共识的成年人)。

Python 不强制限制你访问任何属性或方法,而是相信开发者知道自己在做什么。

特性Java / C++Python
public显式声明默认就是公开的
private编译器强制禁止外部访问没有真正的私有,只有约定
封装性通过访问修饰符强制实现通过命名约定 + 文档 + 信任实现

单下划线_ 、双下划线__ 开头或者结尾的区别

开头/结尾的命名具有不同的语义和用途。它们不是语法强制的访问控制,而是约定(convention)或语言机制(如名称改写、特殊方法)

命名形式是否特殊处理用途说明能否外部访问建议外部使用代码示例
_xxx❌ 否内部实现(约定)✅ 能用作“受保护”成员print(a._xxx)
__xxx✅ 是(改名)避免子类命名冲突✅ 能(改名后)用于需隔离的内部属性print(a._A__xxx)
_xxx_❌ 否无特殊含义✅ 能避免使用print(a._xxx_)
__xxx__✅ 是魔术方法(语言保留)✅ 能只用于标准魔术方法print(a.__xxx__())

在 Python 中,以单下划线 _ 或双下划线 __ 开头/结尾的命名具有不同的语义和用途。它们不是语法强制的访问控制,而是约定(convention)或语言机制(如名称改写、特殊方法)。下面详细解释四种常见形式的区别:

1._xxx——“内部使用”约定(Protected by convention)

含义:

  • 表示这是一个内部实现细节,不应被外部代码直接依赖。
  • 是一种软性提示,不是强制限制。

特点:

  • 可以正常访问:obj._xxx
  • 不会被 from module import * 导入(模块级别)
  • 常用于“受保护”的属性或方法(类似其他语言的 protected

示例:

class MyClass:
    def __init__(self):
        self._internal = 42

obj = MyClass()
print(obj._internal)  # 完全合法,但“不推荐”直接用

📌 用途:告诉其他开发者:“这是我的私有实现,未来可能变动,请别依赖它。”

2.__xxx——名称改写(Name Mangling)

含义:

  • Python 自动重命名该属性,避免子类意外覆盖父类同名属性。
  • 不是为了隐私或安全,而是解决命名冲突。

特点:

  • 在类 MyClass 中定义 __private,实际存储为 _MyClass__private
  • 仍可从外部访问:obj._MyClass__private
  • 仅在类定义内生效(必须出现在类作用域中)

示例:

class Parent:
    def __init__(self):
        self.__secret = "parent"

class Child(Parent):
    def __init__(self):
        super().__init__()
        self.__secret = "child"  # 不会覆盖父类的 __secret!

c = Child()
print(c._Parent__secret)  # 输出: parent
print(c._Child__secret)   # 输出: child

📌 用途:防止子类“不小心”覆盖父类的内部属性。

3._xxx_——通常无特殊含义(但建议避免)

含义:

  • 前后各一个下划线,Python 不会对此做任何特殊处理。
  • 容易与魔术方法混淆,因此官方建议避免这种命名

注意:

  • 不是魔术方法(魔术方法是 __xxx__
  • 可能让人误以为是特殊用途

示例(不推荐):

class BadExample:
    def _method_(self):  # ❌ 看起来怪怪的,像拼写错误
        pass

🚫 PEP 8 建议:不要使用 _xxx_ 这种形式,除非你有非常特殊的理由。

4.__xxx__——魔术方法 / 特殊方法(Magic Methods)

含义:

  • Python 保留给语言本身使用的特殊方法。
  • 用于实现运算符重载、内置函数支持、对象协议等。

特点:

  • 由 Python 解释器在特定场景自动调用
  • 永远不要自己发明 __xxx__ 名字(除非是文档定义的标准方法)

示例:

class Vector:
    def __init__(self, x):
        self.x = x
    
    def __add__(self, other):      # 支持 +
        return Vector(self.x + other.x)
    
    def __str__(self):             # 支持 str() 和 print()
        return f"Vector({self.x})"

📌 用途:让自定义对象支持 +, len(), print(), with, for 等语言特性。

⚠️ 重要:不要创建自己的 __my_custom_method__!这属于 Python 保留命名空间。

总结对比表

命名形式是否特殊处理用途说明能否外部访问建议
_xxx❌ 否内部实现(约定)✅ 能用作“受保护”成员
__xxx✅ 是(改名)避免子类命名冲突(名称改写)✅ 能(改名后)用于真正需要隔离的内部属性
_xxx_❌ 否无特殊含义✅ 能避免使用
__xxx__✅ 是魔术方法(语言保留)✅ 能只用于标准魔术方法

附加建议(来自 PEP 8)

  • __double_leading_and_trailing__: 仅用于魔术方法
  • _single_leading_underscore: 表示内部使用
  • __double_leading_underscore: 触发名称改写
  • 不要使用 _single_trailing_underscore_,除非是为了避免与关键字冲突(如 class_

记住一句话:

“Python 给你自由,但也期望你遵守约定。”
下划线不是锁,而是礼貌的提醒

到此这篇关于Python中单下划线_ 、双下划线__的文章就介绍到这了,更多相关 Python单下划线_ 、双下划线__内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea2020手动安装python插件的实现方法

    idea2020手动安装python插件的实现方法

    这篇文章主要介绍了idea2020手动安装python插件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 从零开始搭建基于Python的微信小程序的教程分享

    从零开始搭建基于Python的微信小程序的教程分享

    这篇文章主要为大家展示了如何从零开始搭建一个基于 Python 的微信小程序项目,包含详细的解决思路、方案和实际案例,希望对大家有所帮助
    2023-05-05
  • Jupyter调用本地文件的实现方式

    Jupyter调用本地文件的实现方式

    文章介绍了在使用Jupyter调用其他Python文件时遇到的两个问题及其解决方法,第一个问题是路径问题,可以通过确保调用的文件和被调用的文件在同一目录或子目录下来解决,第二个问题是当被调用的文件被修改后,需要重新导入模块才能使用新添加的功能
    2026-03-03
  • django+mysql的使用示例

    django+mysql的使用示例

    django可以自动生成这些create table, alter table, drop table的操作,这篇文章主要介绍了django+mysql的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 如何在向量化NumPy数组上进行移动窗口

    如何在向量化NumPy数组上进行移动窗口

    这篇文章主要介绍了如何在向量化NumPy数组上进行移动窗口的操作,具有很好的参考价值,希望对大家有所帮助。
    2021-05-05
  • Python-jenkins模块获取jobs的执行状态操作

    Python-jenkins模块获取jobs的执行状态操作

    这篇文章主要介绍了Python-jenkins模块获取jobs的执行状态操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python 基于Appium控制多设备并行执行

    python 基于Appium控制多设备并行执行

    这篇文章主要介绍了python 如何基于Appium控制多设备并行执行,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • Python Jupyter Notebook导包报错问题及解决

    Python Jupyter Notebook导包报错问题及解决

    在conda环境中安装包后,Jupyter Notebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方法包括卸载并重新安装出错的包,或安装该包的其他版本,此外,确保在正确的环境中安装ipykernel,并使用正确的命令添加和更改kernel
    2025-02-02
  • python中文件操作与异常的处理图文详解

    python中文件操作与异常的处理图文详解

    在实际开发中常常需要对程序中的数据进行持久化操作,而实现数据持久化最直接简单的方式就是将数据保存到文件中,下面这篇文章主要给大家介绍了关于python中文件操作与异常处理的相关资料,需要的朋友可以参考下
    2021-12-12
  • django-rest-framework 自定义swagger过程详解

    django-rest-framework 自定义swagger过程详解

    这篇文章主要介绍了django-rest-framework 自定义swagger过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论