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使用PythonMagick将jpg图片转换成ico图片的方法

    python使用PythonMagick将jpg图片转换成ico图片的方法

    这篇文章主要介绍了python使用PythonMagick将jpg图片转换成ico图片的方法,涉及PythonMagick模块操作图片的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 在Django同1个页面中的多表单处理详解

    在Django同1个页面中的多表单处理详解

    这篇文章主要给大家介绍了在Django同1个页面中的多表单处理的相关资料,文章先给大家介绍了如何快速上手Django实现项目的方法,方便让大家理解和学习,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • python 字符串常用方法汇总详解

    python 字符串常用方法汇总详解

    这篇文章主要介绍了python 字符串方法汇总详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python全字段断言之DeepDiff模块详解

    Python全字段断言之DeepDiff模块详解

    这篇文章主要介绍了Python全字段断言之DeepDiff模块详解,Python中也提供了deepdiff库,常用来校验两个对象是否一致,包含3个常用类,DeepDiff,DeepSearch和DeepHash,,需要的朋友可以参考下
    2023-08-08
  • python中的exec()、eval()及complie()示例详解

    python中的exec()、eval()及complie()示例详解

    这篇文章主要介绍了python中的exec()、eval()及complie(),本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • python中validators库的使用方法详解

    python中validators库的使用方法详解

    这篇文章主要介绍了python中validators库的使用方法详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Python实现定时精度可调节的定时器

    Python实现定时精度可调节的定时器

    这篇文章主要为大家详细介绍了Python实现定时精度可调节的定时器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python查询IP地址归属完整代码

    Python查询IP地址归属完整代码

    这篇文章主要介绍了Python查询IP地址归属完整代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 教你用Python下载抖音无水印视频

    教你用Python下载抖音无水印视频

    这篇文章主要介绍了教你用Python下载抖音无水印视频,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • 详解基于python的全局与局部序列比对的实现(DNA)

    详解基于python的全局与局部序列比对的实现(DNA)

    这篇文章主要介绍了详解基于python的全局与局部序列比对的实现(DNA).文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论