Python五种下划线详解

下面是关于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无法用requests获取网页源码的解决方法

    以下是关于Python无法用requests获取网页源码的解决方法的攻略: Python无法用requests获取网页源码的解决方法 在Python中,requests是一个流行的HTTP库,可以用于向Web发送HTTP请求和接响应。但是,在某些情况下,我们可能无法使用requests获取网页源码。以下是Python无法用requests获取网页源码的解决方…

    python 2023年5月14日
    00
  • Python计算素数个数的两种方法

    Python计算素数个数的两种方法 本文介绍计算素数个数的两个方法:暴力枚举法和埃拉托色尼筛法。两种方法虽然在时间复杂度上有所不同,但都可以有效地计算素数的个数。 一、暴力枚举法 暴力枚举法顾名思义,就是从1到n,枚举每个数字,然后判断它是否是素数。具体实现,可以使用双重循环来实现,最外层循环枚举数字,内层循环判断是否为素数。判断素数的方法,可以使用试除法,…

    python 2023年6月3日
    00
  • python-docx如何缩进两个字符

    要让python-docx生成的Word文档内容缩进两个字符,可以使用Python字符串的缩进操作。 首先,我们需要安装python-docx库。可以使用pip命令进行安装: pip install python-docx 然后,我们可以使用python-docx库创建一个Word文档,并添加段落和文本内容: from docx import Documen…

    python 2023年6月5日
    00
  • Python算法之图的遍历

    下面是关于“Python算法之图的遍历”的完整攻略。 1. 图的遍历简介 图的遍历是指从图的某个顶点出发,按照一定的规则依访问图中的顶点,且每个点仅被访问一次的过程。图的遍历算法是图论中的基本算法一,常用于解决图论中一些问题,如最短路径、连通性等。 2 Python实现图的遍历 2.1 算法流程 图遍历算法主要有两种:深度优先遍历(DFS和广度优先遍历(BF…

    python 2023年5月13日
    00
  • Python numpy.power()函数使用说明

    Python numpy.power()函数使用说明 函数介绍 numpy.power()函数用于数组元素的指数值运算,其第一个参数为数组,第二个参数为指数值,返回值为数组元素的指数值运算结果。 函数语法 numpy.power(x1, x2, /, out=None, *, where=True, casting=’same_kind’, order=’K…

    python 2023年5月13日
    00
  • pygame外星人入侵小游戏超详细开发流程

    Pygame外星人入侵小游戏超详细开发流程 介绍 本文将提供超详细的 Pygame 外星人入侵小游戏开发流程,为想要学习 Pygame 或者开发小游戏的开发者提供帮助。 准备 在开始之前,您需要安装 Pygame,可以通过 pip 进行安装: pip install pygame 创建窗口 首先,我们需要创建游戏窗口。需要导入 Pygame 和 sys 模块…

    python 2023年6月3日
    00
  • python 遍历可迭代对象的实现方法

    下面是关于Python遍历可迭代对象的实现方法的完整攻略。 什么是可迭代对象 在Python中,如果一个对象可以通过迭代的方式逐个访问它的元素,那么这个对象就是可迭代对象。常见的可迭代对象有列表、元组、字符串、字典等。 如何遍历可迭代对象 Python提供了多种遍历可迭代对象的方法,下面介绍其中的几种常见方法。 方法一:for循环 for item in i…

    python 2023年5月13日
    00
  • python实现监控linux性能及进程消耗性能的方法

    实现监控Linux性能及进程消耗性能的方法主要包含以下几个步骤: 第一步:安装必要软件 监控Linux性能和进程消耗性能通常需要借助于第三方工具,比如Grafana和Prometheus。可以参考以下步骤安装这两个软件(注:以下操作基于Ubuntu系统): 安装最新版Grafana: wget -q -O – https://packages.grafana…

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