python单下划线和双下划线属性区别

 更新时间:2025年12月25日 10:44:28   作者:珠峰日记  
本文主要介绍了python单下划线和双下划线属性区别,主要在于命名规范、访问意图、名称改写机制以及子类继承中的表现,感兴趣的可以了解一下

在Python类中,单下划线开头的属性( _attr)和双下划线开头的属性( __attr)主要有以下区别:

1. 命名规范与访问意图

  • 单下划线(_attr):
    属于约定俗成的“受保护”属性,仅作为开发者之间的约定,提示该属性不应被外部直接访问,但Python本身不强制限制访问
    本质上和普通属性无语法差异,只是一种代码规范(PEP 8),用于标识“内部使用”的属性/方法。

  • 双下划线(__attr):
    属于私有属性,Python会对其进行名称改写(name mangling),以防止子类意外覆盖或外部直接访问,是一种语法层面的限制。

2. 名称改写机制

  • 双下划线属性
    Python会将__attr自动改写为_类名__attr(例如,类A中的__x会变成_A__x),外部或子类无法直接通过__attr访问,需通过改写后的名称或类内方法访问。
    示例

    class A:
        def __init__(self):
            self.__x = 10  # 双下划线属性
    
    a = A()
    print(a.__x)  # 报错:AttributeError
    print(a._A__x)  # 输出10(可通过改写后的名称访问)
    
  • 单下划线属性
    无名称改写,外部仍可直接访问(如a._x),仅靠开发者自觉遵守“不外部访问”的约定。
    示例

    class B:
        def __init__(self):
            self._y = 20  # 单下划线属性
    
    b = B()
    print(b._y)  # 输出20(无语法限制)
    

3. 子类继承中的表现

  • 单下划线属性
    子类可直接继承并访问,无语法限制(仍靠约定)。

    class Parent:
        def __init__(self):
            self._x = 10
    
    class Child(Parent):
        def show(self):
            print(self._x)  # 正常输出10
    
    c = Child()
    c.show()
    
  • 双下划线属性
    子类无法直接访问父类的双下划线属性(因名称改写),需通过父类提供的方法访问。

    class Parent:
        def __init__(self):
            self.__x = 10
        def get_x(self):
            return self.__x
    
    class Child(Parent):
        def show(self):
            print(self.__x)  # 报错:AttributeError(子类自身无__x)
            print(self.get_x())  # 输出10(通过父类方法访问)
    
    c = Child()
    c.show()
    

4. 用途总结

  • 单下划线(_attr):
    用于标识“内部使用”的属性/方法,提醒开发者避免外部直接调用,适用于模块内或类内的私有逻辑,但不强制限制。
    常见于模块级别的“私有”函数/变量(如import *不会导入单下划线开头的对象)。

  • 双下划线(__attr):
    用于真正需要限制访问的场景(如避免子类覆盖父类属性、防止外部篡改),通过名称改写实现语法级别的隔离,但并非绝对安全(仍可通过_类名__attr访问)。

注意

Python中不存在真正的“私有”属性,双下划线的限制可被绕过,其设计目的是避免意外冲突,而非阻止恶意访问。实际开发中,单下划线的约定更常用,双下划线慎用(可能增加代码复杂度)。

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

相关文章

  • 书写Python代码的一种更优雅方式(推荐!)

    书写Python代码的一种更优雅方式(推荐!)

    Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,下面这篇文章主要给大家介绍了关于书写Python代码的一种更优雅方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • Python实现PDF转Word的方法详解

    Python实现PDF转Word的方法详解

    由于PDF的文件大多都是只读文件,有时候为了满足可以编辑的需要通常可以将PDF文件直接转换成Word文件进行操作。本文为大家整理了一些实现方法,希望对大家有所帮助
    2023-02-02
  • Python的多种对象工厂模式方便代码维护扩展

    Python的多种对象工厂模式方便代码维护扩展

    这篇文章主要为大家介绍了Python的多种对象工厂模式更方便我们进行代码维护扩展,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python中对象的比较操作==和is区别详析

    Python中对象的比较操作==和is区别详析

    这篇文章主要给大家介绍了关于Python中对象的比较操作==和is区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python实现一个简单的验证码程序

    Python实现一个简单的验证码程序

    这篇文章主要介绍了Python实现一个简单的验证码程序,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 详细介绍Python函数中的默认参数

    详细介绍Python函数中的默认参数

    这篇文章主要介绍了详细介绍Python函数中的默认参数,包括默认参数的传递和求值等内容,需要的朋友可以参考下
    2015-03-03
  • Python连接和操作Elasticsearch的流程步骤

    Python连接和操作Elasticsearch的流程步骤

    本文将详细介绍如何使用 Python 连接和操作 Elasticsearch,包括安装客户端、基本的操作(如创建索引、添加数据、查询数据等)以及高级应用(如聚合查询、索引映射等),需要的朋友可以参考下
    2025-04-04
  • Python入门之字符串操作详解

    Python入门之字符串操作详解

    字符串是Pyhon常用的数据类型,这篇文章主要为大家详细介绍一下python字符串的一些常见实用操作,需要的朋友可以参考下
    2022-09-09
  • Python中如何实现真正的按位取反运算

    Python中如何实现真正的按位取反运算

    按位取反是位运算符,而位运算符是应用在两个数的运算上,会对数字的二进制所有位数进行从低到高的运算,下面这篇文章主要给大家介绍了关于Python中如何实现真正的按位取反运算的相关资料,需要的朋友可以参考下
    2023-02-02
  • Python Web框架Tornado运行和部署

    Python Web框架Tornado运行和部署

    这篇文章主要为大家详细介绍了Python Web框架Tornado运行和部署的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04

最新评论