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 Django 通用视图和错误视图的使用代码

    Python Django 通用视图和错误视图的使用代码

    这篇文章主要介绍了Python Django 通用视图和错误视图的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • python使用form-data形式上传文件请求的方法

    python使用form-data形式上传文件请求的方法

    Python中的multipart/form-data是一种HTTP POST请求的数据格式,用于上传文件或二进制数据,下面这篇文章主要给大家介绍了关于python使用form-data形式上传文件请求的相关资料,需要的朋友可以参考下
    2023-04-04
  • 基于python实现生成指定大小txt文档

    基于python实现生成指定大小txt文档

    这篇文章主要介绍了基于python实现生成指定大小txt文档,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 快速一键生成Python爬虫请求头

    快速一键生成Python爬虫请求头

    这篇文章主要介绍了如何快速一键生成Python爬虫请求头,帮助大家更好的理解和学习使用python爬虫,感兴趣的朋友可以了解下
    2021-03-03
  • 详解如何用Python写个听小说的爬虫

    详解如何用Python写个听小说的爬虫

    在路上经常发现好多人都喜欢用耳机听小说,同事居然可以一整天的带着一只耳机听小说。本文就用Python爬虫实现下载听小说tingchina.com的音频,需要的可以参考一下
    2022-02-02
  • 深入理解Python中变量赋值的问题

    深入理解Python中变量赋值的问题

    在 python 中赋值语句总是建立对象的引用值,而不是复制对象。因此,python 变量更像是指针,而不是数据存储区域,这点和大多数语言类似吧,比如 C++、java 等。下面这篇文章主要介绍了Python中变量赋值的问题,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • python操作文件的参数整理

    python操作文件的参数整理

    在本篇文章中我们给大家总结了关于python操作文件的相关参数以及用法内容,需要的朋友们学习下。
    2019-06-06
  • Python调用Elasticsearch更新数据库的操作方法

    Python调用Elasticsearch更新数据库的操作方法

    Elasticsearch是一个分布式、多租户的全文搜索引擎,支持HTTP Web接口和无模式的JSON文档,本文介绍Python调用Elasticsearch更新数据库的相关操作,感兴趣的朋友一起看看吧
    2024-12-12
  • 简述python Scrapy框架

    简述python Scrapy框架

    这篇文章主要介绍了python Scrapy框架的相关资料,帮助大家开始学习python 爬虫,感兴趣的朋友可以了解下
    2020-08-08
  • Python多线程扫描端口代码示例

    Python多线程扫描端口代码示例

    这篇文章主要介绍了Python多线程扫描端口代码示例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02

最新评论