Python 双下划线开头的具体使用

 更新时间:2026年02月12日 09:52:35   作者:自由生长2024  
本文主要介绍了Python 双下划线开头的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 Python 中,以两个下划线开头(如 __method)的方法或属性,并不完全是“私有方法”(private method)——因为 Python 并没有像 Java 或 C++ 那样严格的访问控制机制。但这种命名方式会触发一种叫做 名称改写(name mangling)的机制,从而在一定程度上实现“私有性”。

1. 名称改写(Name Mangling)

当你在一个类中定义一个以双下划线开头、且不以双下划线结尾的方法或属性时,Python 解释器会自动将其名称改写为:

_ClassName__original_name

例如:

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

    def __private_method(self):
        return "This is private"

obj = MyClass()
# obj.__private_method()  # AttributeError!
print(obj._MyClass__private_method())  # 可以访问,但不推荐

虽然你仍然可以通过 _ClassName__name 的方式访问到这个“私有”成员,但这是一种约定+语言机制,目的是防止子类意外覆盖父类的内部方法,也提示开发者“这是内部使用的,不要直接调用”。

2. 与单下划线的区别

  • 单下划线开头(如 _method):只是约定表示“内部使用”,不会触发名称改写,外部仍可访问。
  • 双下划线开头(如 __method):触发名称改写,提供更强的封装暗示。

3. 特殊方法(魔术方法)例外

注意:如果方法名前后都有两个下划线(如 __init__, __str__),这是 Python 的特殊方法(也叫魔术方法),不会被名称改写,也不表示私有,而是用于实现特定语言特性。

1. 类的特殊方法(魔术方法)

以双下划线开头和结尾的方法,被称为特殊方法或者魔术方法(Magic Methods)。这些方法由 Python 解释器自动调用,我们可以通过重写它们来实现特定的类行为。

示例

class MyClass:
    def __init__(self, value):  # 实例初始化方法
        self.value = value
    
    def __str__(self):  # 定义实例的字符串表示
        return f"MyClass(value={self.value})"
    
    def __add__(self, other):  # 定义加法操作
        return MyClass(self.value + other.value)
    
    def __len__(self):  # 定义长度
        return len(str(self.value))

常用的魔术方法

  • __init__:对象初始化
  • __str__ 和 __repr__:字符串表示
  • __len__:长度
  • __add____sub____mul__:算术运算符
  • __eq____lt____gt__:比较运算符
  • __iter__ 和 __next__:迭代器协议
  • __getitem__ 和 __setitem__:索引操作

4.与单下划线的区别

  • 单下划线(_method):这是一种约定,表示方法是受保护的(protected),不应该在类外部直接使用。不过 Python 并不会强制限制这种访问。
  • 双下划线(__method):会通过名称修饰机制,让方法更难以被外部访问,主要用于避免子类命名冲突。

示例对比

class Parent:
    def _protected(self):  # 单下划线
        return "受保护的方法"
    
    def __private(self):  # 双下划线
        return "私有的方法"

class Child(Parent):
    pass

c = Child()
print(c._protected())  # 可以正常调用
print(c._Parent__private())  # 可以访问,但需要使用修饰后的名称
print(c.__private())  # 报错:AttributeError

4. 注意事项

  • 避免过度使用双下划线:除非确实需要防止子类覆盖方法,否则建议使用单下划线来表示约定上的私有性。
  • 特殊方法和私有方法:不要混淆特殊方法(如 __str__)和私有方法(如 __private)。特殊方法是 Python 语言的一部分,而私有方法是类设计的一种选择。

总结

  • Python 没有真正的“私有方法”。
  • __method 会被名称改写,起到模拟私有的作用。
  • 仍可通过 _ClassName__method 访问,但应避免这样做。
  • 这是一种约定 + 语言机制,用于封装和避免命名冲突。

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

相关文章

  • Python使用Matplotlib绘制基础可视化图表的完整指南

    Python使用Matplotlib绘制基础可视化图表的完整指南

    在Python中进行数据可视化,最常用且功能强大的库是 Matplotlib,它可以帮助你轻松绘制出柱状图,折线图,饼图,散点图等,下面小编就和大家详细介绍一下具体实现方法吧
    2026-05-05
  • Django3中的自定义用户模型实例详解

    Django3中的自定义用户模型实例详解

    这篇文章主要给大家介绍了关于Django3中自定义用户模型的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python实现Logger打印功能的方法详解

    Python实现Logger打印功能的方法详解

    最近工作中遇到了打印的需求,通过查找相关的资料发现Python中Logger可以很好的实现打印,所以下面这篇文章主要给大家介绍了关于Python如何实现Logger打印功能的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-09-09
  • 基于Python实现俄罗斯方块躲闪小游戏

    基于Python实现俄罗斯方块躲闪小游戏

    这篇文章主要为大家详细介绍了如何基于Python实现有趣的俄罗斯方块躲闪小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • 用Python实现一个简单的用户系统

    用Python实现一个简单的用户系统

    大家好,本篇文章主要讲的是用Python实现一个简单的用户系统,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • pytorch 把图片数据转化成tensor的操作

    pytorch 把图片数据转化成tensor的操作

    这篇文章主要介绍了pytorch 把图片数据转化成tensor的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 3个 Python 编程技巧

    3个 Python 编程技巧

    这篇文章主要介绍 Python 编程技巧,我们知道,字典的本质是哈希表,本身是无法排序的,但 Python 3.6 之后,字典是可以按照插入的顺序进行遍历的,这就是有序字典,其中的原理,可以阅读为什么 Python3.6 之后字典是有序的。本文也会介绍该内容,需要的朋友可以参考一下
    2021-10-10
  • 分享8点超级有用的Python编程建议(推荐)

    分享8点超级有用的Python编程建议(推荐)

    这篇文章主要介绍了分享8点超级有用的Python编程建议(推荐),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-10-10
  • 理想高通滤波实现Python opencv示例

    理想高通滤波实现Python opencv示例

    今天小编就为大家分享一篇关于理想高通滤波实现Python opencv示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Python range函数之生成器函数的示例

    Python range函数之生成器函数的示例

    这篇文章主要介绍了Python range函数之生成器函数的示例,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12

最新评论