详解Python 下划线、双下划线的涵义

yizhihongxing

Python 中下划线和双下划线是有特殊含义的,使用它们可以实现一些特殊的功能。

单下划线 _

在 Python 中,单下划线 _ 常用于以下几种情况:

用于解决名称冲突

如果有一个变量名和 Python 中的关键字重名,但你又不想改变该变量名,就可以在名称前加上一个下划线 _,以避免与关键字冲突,例如:

if_ = 5  # `if` 是关键字,加上下划线来做变量名

用于私有变量

在 Python 中,单下划线 _ 也常用于定义私有变量,即该变量应该在类内部使用,不希望外部访问该变量。需要注意的是,单下划线并不能真正意义上限制外部访问变量,只是一种暗示作用。

class MyDemo:
    def __init__(self):
        self.public_var = 'public'
        self._private_var = 'private'

demo = MyDemo()
print(demo.public_var)     # 非私有变量,可以正常访问
print(demo._private_var)   # 私有变量,也可以访问,但是不推荐

用于类型注解

在 Python 3.10 之后,单下划线 _ 还可以用于类型注解中,表示一个占位符或标志注解。例如:

def foo() -> list[_]:  # `_` 表示元素类型未知
    return [1, 2, 3]

双下划线 __

双下划线 __ 是 Python 中的魔术方法(Magic Method),用于重写类的特殊方法,例如:

class MyClass:
    def __init__(self, x):
        self.x = x

    def __str__(self):
        return f'x is {self.x}'

my_obj = MyClass(5)
print(my_obj)  # 调用 __str__ 方法

除此之外,双下划线在访问和继承属性时也有特殊含义,具体如下:

名称重整

Python 中的名称重整(Name Mangling)机制会根据变量名加上类名前缀,以避免变量名冲突。双下划线在这里的作用是将名称重整成 _<class-name>__<attribute-name> 的形式,例如:

class MyClass:
    def __init__(self):
        self.__x = 5

my_obj = MyClass()
print(my_obj.__x)  # 报错,无法访问 __x 属性
print(my_obj._MyClass__x)  # 正确,MyClass 的实例属性 __x 重命名为 _MyClass__x

子类无法继承父类双下划线属性

当子类继承父类时无法访问父类中带有双下划线的属性,这是因为父类属性已经被名称重整了。例如:

class A:
    __x = 5

class B(A):
    def print_x(self):
        print(self.__x)

b = B()
b.print_x()  # 报错,无法访问 __x 属性

可以使用 _A__x 的方式来访问父类中的属性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python 下划线、双下划线的涵义 - Python技术站

(0)
上一篇 2023年3月25日
下一篇 2023年3月25日

相关文章

  • python写入中英文字符串到文件的方法

    当我们需要把字符串写入文件中保存时,我们可以利用 Python 内置的文件操作来实现,其中需要注意一些细节问题。 1. 打开文件 在文件操作中,首先需要打开文件。要打开文件,我们需要使用 Python 内置的 open() 函数,该函数有两个参数:文件路径和打开模式。 其中,文件路径指需要打开的文件所在的路径和文件名;打开模式指打开文件的方式,有读取、写入、…

    python 2023年5月20日
    00
  • 分享一个python的aes加密代码

    下面我将详细讲解“分享一个python的aes加密代码”的完整攻略,过程中将包含两个示例说明。 1. 了解AES加密算法 AES是一种高级加密标准,它能够在计算机系统中保护数据的安全性和机密性。AES可以使用不同的密钥长度,最常用的密钥长度为128位、192位和256位。 AES加密算法有两种模式:ECB模式和CBC模式。在本例中,我们将使用CBC模式。 完…

    python 2023年6月3日
    00
  • Python嵌套列表转一维的方法(压平嵌套列表)

    Python嵌套列表转一维的方法(压平嵌套列表) 在Python中,嵌套列表是一种常见的数据结构。有时候,我们需要将嵌套列表转换为一维列表,以便更方便地进行处理。本文将介绍Python中套列表转一维列表的方法,也称为“压平嵌套列表”。 方法一:使用列表推导式 使用列表推导式是一种单而有效的方法,可以将嵌套列表转换为一维列表。下面是一个示例,演示了如何使用列表…

    python 2023年5月13日
    00
  • python列表list保留顺序去重的实例

    以下是“Python列表list保留顺序去重的实例”的完整攻略。 1. Python列表list简介 在Python中,list是一种常用的数据结构,可以储任意的数据类型,包括数字、字符串列表等。list是一种可变的序列,可以进行、删除、修改等操作。 2 Python列表list保留顺序去重 在Python中,我们可以使用set()函数将list中的重复元素…

    python 2023年5月13日
    00
  • python爬虫常用的模块分析

    Python爬虫常用的模块分析 在Python中,爬虫是很常见的一个应用场景。Python作为一门强大的脚本语言,有很多强大的库可以用于爬虫。下面就对Python爬虫常用的模块进行分析。 requests模块 requests模块是Python中最常用的http请求库之一。可以使用它发送get、post等http请求。该模块提供了很多常用的方法,如get()…

    python 2023年5月14日
    00
  • sip消息拆包原理及组包流程

    操作系统 :CentOS 7.6_x64      freeswitch版本 :1.10.9 sofia-sip版本: sofia-sip-1.13.14   freeswitch使用sip协议进行通信,当sip消息超过mtu时,会出现拆包的情况,这里整理下sip消息拆包原理及组包流程。 一、拆包的原理  简单来说:拆包的原因是,sip消息过长,超过mtu值…

    python 2023年4月18日
    00
  • 一文带你了解Python中的字符串是什么

    一文带你了解Python中的字符串是什么 在Python中,字符串是一种非常重要的数据类型。本文将介绍Python中的字符串是什么,如何创建字符串、如何访问字符串中的字符以及常用的字符串操作。 字符串是什么 字符串是Python中表示文本的数据类型。在Python中,字符串是一个字符序列,可以包含任何字符,包括字母、数字、符号等等。字符串是不可变的,这意味着…

    python 2023年5月20日
    00
  • 如何使用python写截屏小工具

    下面是如何使用Python写截屏小工具的完整攻略。 1. 准备工作 在开始编写截屏小工具前,需要先安装Python和相关的库。 安装Python环境 Python是一种广泛使用的高级编程语言,因为开源免费的特性和优良的语法,在开发小工具时很受欢迎。Python的官方网站是 python.org,可以从官网下载并安装Python。 安装必要的库 在编写截屏小工…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部