Python五种下划线详解

yizhihongxing

下面是关于Python五种下划线的详细讲解及示例说明。

一、概述

在Python中,下划线(_)有五种不同的使用方式,它们分别是:

  • 单个下划线:命名约定,表示弱内部使用,不会呈现在from module import *
  • 单个前置下划线:命名约定,表示为非导出属性或方法
  • 单个后置下划线:用于避免与Python关键字名称的冲突
  • 双前置下划线:名称修饰,用于使属性变成私有(实际上还是被Python重命名了)
  • 双前后置下划线:名称修饰,用于避免名称与父类属性或方法的冲突

下面我将分别对以上不同用法进行详细解释,并提供相应的示例。

二、单个下划线

单个下划线在Python中是一种命名约定,表示该属性或者方法仅供内部使用。这意味着,如果在模块中使用from module import * 进行导入,该属性或方法并不会被导入。因此,单个下划线经常被用来声明实现细节的非公共成员,即使这些非公共成员会在外部被使用。

示例:

class A:
    def __init__(self):
        self.public_var = 1
        self._private_var = 2

a = A()
print(a.public_var)     #输出 1
print(a._private_var)   #输出 2

在上面的代码中,我们定义了一个类A,其中包含两个变量public_var和_private_var。其中public_var是公共成员,可以直接被外部程序访问,而_private_var是单个下划线下的成员,属于弱内部使用,但并不表示不能被外部访问。实际上,我们在使用print(a._private_var)输出_private_var时,可以发现输出的结果正是2。

三、单个前置下划线

单个前置下划线是一种命名约定,表示该属性或者方法只在类或模块内部使用。它并不会限制内部的调用,但外部调用会受到警告。单个前置下划线并不会防止外部调用使用这个属性或方法,但它可以让外部调用者更谨慎地使用它们。

示例:

class A:
    def __init__(self):
        self.public_var = 1
        self._private_var = 2
        self.__very_private_var = 3

a = A()
print(a.public_var)               #输出 1
print(a._private_var)             #输出 2
print(a.__very_private_var)       #报错 AttributeError: 'A' object has no attribute '__very_private_var'

在以上代码中,我们在类A内部定义了三个变量,分别是public_var、_private_var、__very_private_var,并打印了此三个变量的值。由于在Python中具有名称修饰的特性,__very_private_var实际上在类A内部已经被重命名成了_A__very_private_var。因此,如果我们尝试直接使用__very_private_var,就会出现报错。

四、单个后置下划线

单个后置下划线通常用于避免与Python关键字或已有的标识符名称的冲突。通常将下划线与已有名称的结尾相连,因为这样可以清楚地表示该名称不同于已有名称,但这并不会改变名称的意义。

示例:

class A:
    def __init__(self):
        self.class_ = "class"
        self.import_ = "import"

a = A()
print(a.class_)     #输出 class
print(a.import_)    #输出 import

在以上代码中,我们在类A内部初始化了两个变量,分别是class_和import_。这两个变量都是已有的Python关键字,并且与内置函数有冲突。因此,我们在使用这两个变量时,在它们的名称末尾添加单个下划线,来避免冲突,同时也保留了名称的意义。

五、双前置下划线

双前置下划线用于进行名称修饰,将属性变成私有。通过这种方式,我们可以避免在子类中意外覆盖来自父类的属性,在方法之前添加双下划线即可修饰。

在Python中,双下划线会导致Python重命名属性或者方法,以避免与子类属性相冲突。Python会将属性名字改成_类名__属性名,这个过程就称为名称修饰。

示例:

class A:
    def __init__(self):
        self.__very_private_var = 1

class B(A):
    def __init__(self):
        super().__init__()
        self.__very_private_var = 2

b = B()
print(b._A__very_private_var)   #输出 1
print(b._B__very_private_var)   #输出 2

在以上代码中,我们定义了两个类A、B,并在类A中定义了私有变量__very_private_var,在类B中覆盖了__very_private_var,并定义了实例b。我们可以发现,由于类A中的私有变量已经重命名成了_A__very_private_var,因此当我们想要输出类A中的私有变量时,可以使用b._A__very_private_var,而想要输出类B中的私有变量时,可以使用b._B__very_private_var。

六、双前后置下划线

双前后置下划线与双下划线类似,也是一种名称修饰。通常,这种方法用于避免子类的名称与父类的名称冲突,例如,如果我们在子类中定义了一个方法名为__init__,那么子类将会覆盖父类中的__init__方法。因此,当我们想要在子类中使用此方法时,需要使用名称修饰。

示例:

class A:
    def __init__(self):
        self.public_var = 1
        self.__very_private_var = 2

class B(A):
    def __init__(self):
        super().__init__()
        self.public_var = 3
        self.__very_private_var = 4

b = B()
print(b.public_var)         #输出 3
print(b._A__very_private_var)   #输出 2
print(b._B__very_private_var)   #输出 4

在上面的代码中,我们定义了两个类A、B,并在类A中定义了公共变量public_var和私有变量__very_private_var。在类B中,我们通过名称修饰的方式重写了类A中的方法,并初始化了公共变量和私有变量。在输出时,我们可以发现,public_var被成功重写,并输出了3,而B类中的私有变量和A类中的私有变量分别被重命名成了_B__very_private_var和_A__very_private_var,输出时也可以按照此方式输出。

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

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Python基础之文件操作及光标移动详解

    Python基础之文件操作及光标移动详解 在Python中,文件操作是非常常见的操作之一。Python提供了多种文件操作函数方法,可以帮助我们读、写入、复制、移动、删除文件等。本文将详细介绍Python文件操作的基础知识,括文件打开、读写、关闭复制、移动、删除等操作。 文件打开 在Python中,我们可以使用open()函数打一个文件。open()函数的语法…

    python 2023年5月14日
    00
  • python按比例随机切分数据的实现

    当我们需要对数据集进行训练、验证和测试时,常常需要按比例将数据集划分为不同的部分。Python提供了很多方法来完成这个任务,下面我们将分步骤讲解如何用Python按比例随机切分数据集。 步骤一:导入所需的库 首先,我们需要导入Python的一些库来处理数据集。我们需要使用numpy库读取数据集,以及使用train_test_split函数按比例随机划分数据集…

    python 2023年6月3日
    00
  • Python制作七夕比心表白代码详解

    让我为你详细讲解如何制作七夕比心表白代码: 准备工作 在开始制作七夕比心表白代码之前,我们需要先准备好以下工具和环境: Python 编程语言 代码编辑器,比如 VS Code、PyCharm 等 Pillow 图像处理库 在确认已经安装好以上工具和环境后,我们可以开始制作七夕比心表白代码了。 制作过程 开发七夕比心表白代码的过程可以分为以下几个步骤: 步骤…

    python 2023年5月18日
    00
  • python os.path.isfile()因参数问题判断错误的解决

    当使用 os.path.isfile() 函数判断文件是否存在时,如果传入的路径字符串以斜杠或反斜杠结尾,可能会导致函数判断出错。下面是解决该问题的完整实例教程。 1.问题现象 假设我们有以下的目录结构和文件内容: – project/ – main.py – data/ – file.txt 以下代码使用 os.path.isfile() 函数来判断文件是…

    python 2023年5月13日
    00
  • python基础之for循环

    当我们需要对一个序列或其他可迭代对象的元素逐一进行操作时,可以使用for循环来遍历这个序列。for循环是Python中最常用的循环结构之一,它的基本语法如下: for 变量 in 可迭代对象: 执行代码块 其中,变量是一个临时变量,它会依次赋值为可迭代对象中的每个元素,然后执行代码块。可迭代对象可以是列表、元组、字符串、集合、字典等。 1. 遍历列表 假设我…

    python 2023年5月14日
    00
  • python快排算法详解

    以下是关于“Python实现的快速排序算法详解”的完整攻略: 简介 快速排序是一种常见的排序算法,它的时间复杂度为O(nlogn)。在本教程中,我们将介绍如何使用Python实现快速排序算法,包括快速排序的基本原理、快速排序的实现方法、快速排序的优化等。 快速排序的基本原理 快速排序的基本原理是通过分治的思想将一个大问题分解为多个小问题,并将小问题的解合并成…

    python 2023年5月14日
    00
  • 如何利用python实现图片批处理

    我们来详细讲解如何利用Python实现图片批处理。 一、环境准备 在开始前,我们需要先安装以下两个Python库: Pillow。一个Python Imaging Library(PIL)的分支项目,可以用于图片处理和图像识别等。 pip install Pillow os。一个Python自带的用于处理文件和目录的标准库,常用于文件系统操作。 不需要进行安…

    python 2023年5月18日
    00
  • Python在字典中查找元素的3种方式

    Python中常见的数据结构之一是字典。字典是由键和值组成的无序集合,其中的键是唯一的。我们需要在字典中查找元素时,可以使用以下三种方式。 使用in关键字查找 在Python中,可以使用in关键字来检查字典中是否存在某个键,如果存在则返回True,否则返回False。 # 示例1 user_dict = {‘name’: ‘Alice’, ‘age’: 20…

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