通俗讲解Python中的五种下划线含义

下面我来详细讲解Python中的五种下划线含义。

一、单下划线(_)

在Python中,以单下划线开头的变量、方法或者属性,表示这是一个私有的成员,外界不应该直接访问,但是这并不是真正意义上的私有,Python并没有像其他语言那样提供严格的访问控制。因此,开发者需要自觉遵守约定,不要直接访问私有成员,而应该通过公共接口来进行操作。

示例:

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age

    def _get_age(self):
        return self._age

    def get_info(self):
        return f"I'm {self._name}, {self._get_age()} years old." 

person = Person("Lucy", 20)
print(person.get_info())

在这个示例中,我们使用单下划线开头对属性和方法进行了「假私有」处理,外部代码没有办法直接访问。如果我们直接使用person._name或者person._get_age()的话,其实是可以正常访问的,但是这么做不好,会影响代码的可读性和可维护性。所以我们在编写代码的时候,需要按照约定来进行操作。

二、双下划线(__)

以双下划线开头(但不以双下划线结尾)的变量、方法或者属性,Python会对其进行名称修饰,使得其在类的内部和外部都无法直接访问。这个过程叫做「名称修饰」,Python将变量名,改为了 _类名__变量名 的格式。

示例:

class A:
    def __init__(self):
        self.__b = "hello"

a = A()
# print(a.__b)  # 报错,外部无法访问

print(a._A__b)  # 可以正常访问

在这个例子中,我们定义了一个A类,并在其中使用双下划线开头的b属性。我们可以看到,如果直接访问a.__b的话,会报错;但是如果我们通过a._A__b来访问,就可以正常得到结果了。不过,这种方式并不推荐使用,因为这样会导致代码在其他类中无法重用。

三、单下划线(_)和双下划线(__)的区别

单下划线开头和双下划线开头的属性和方法,在类的内部都是可以被正常访问的,但是在外部的使用上,就有所区别了。

  • 使用单下划线开头声明的属性和方法,表示这是一个约定俗成的「伪私有」成员,不应该直接访问,无法通过 from module import * 导入。
  • 使用双下划线开头声明的属性和方法,Python会进行名称修饰,尽可能地避免与其他属性和方法名冲突,使得其在内部和外部都无法直接访问。

示例:

class Example:
    def __init__(self):
        self._name = "Tom"        # 以单下划线开头

    def __get_name(self):        # 以双下划线开头
        return self._name

exp = Example()
print(exp._name)  # 可以访问,但不推荐这么做

# print(exp.__get_name())  # 外部无法直接访问
print(exp._Example__get_name())   # 可以访问,但不推荐这么做

四、单下划线(_)的其他用途

除了上面提到的「伪私有」,单下划线还有一些其他的使用场景。

1、占位符

单下划线在Python中被用作一个占位符,给变量或者函数参数预留了位置,表示这是一个不重要的、丢弃的值,不会被直接使用。在Python中,也有些库经常会使用「_」来表示丢弃的返回值。

示例:

def do_something():
    for _ in range(5):
        print("hello world")

do_something()

在这个例子中,我们定义了一个函数do_something(),并使用单下划线来代替循环变量的名字,表示循环变量实际上没有被使用,用单下划线「_」来进行占位。

2、防止命名重复

在Python中,有些时候我们需要在子类中重新定义父类的同名方法或属性,并希望在子类中能够区分开来。这个时候,我们就可以使用单下划线来防止名称冲突。

示例:

class Base:
    def __init__(self):
        self.x = 0

class Sub1(Base):
    def __init__(self):
        super().__init__()
        self._x = 1

class Sub2(Base):
    def __init__(self):
        super().__init__()
        self._x = 2

sub1 = Sub1()
sub2 = Sub2()
print(sub1.x, sub1._x)  # 0 1
print(sub2.x, sub2._x)  # 0 2

在这个例子中,我们定义了一个Base类,并分别在Sub1Sub2中重新定义了x属性。我们使用了单下划线来对子类中的属性进行「重命名」,避免了属性名的冲突。

五、双下划线开头和结尾(xxx)

双下划线开头和结尾的变量是Python特殊的名称,也被称为 「魔法方法」。这些变量在Python中有着特殊的用途,它们定义了类的行为和属性,但是一般情况下,并不需要我们手动去调用它们。

示例:

class MyClass:
    def __init__(self, value):
        self.__value = value

    def __str__(self):
        return f"MyClass's value is {self.__value}."

    def __add__(self, other):
        result = MyClass(self.__value + other.__value)
        return result

a = MyClass(10)
b = MyClass(20)
print(a)
print(a + b)

在这个例子中,我们定义了一个MyClass类,并重写了类中的__init____str____add__方法。这三个方法是Python的「魔法方法」,定义了类的构造、字符串打印、运算行为等特殊操作,可以使得开发者更好地使用类和对象。

总之,Python中的下划线有很多特殊含义,开发者在进行编程时,需要根据各种情况灵活使用,遵守约定。

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

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

相关文章

  • Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程

    来分享一下“Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程”这一完整攻略。 1. 确认环境和工具 首先,需要确认自己所使用的环境和工具。在进行Python GUI程序的开发之前,我们需要安装Python、wxPython和py2exe等相关的工具。可以参考以下步骤进行安装: 安装Python3.x版本:从Python…

    python 2023年6月3日
    00
  • Python完成哈夫曼树编码过程及原理详解

    Python完成哈夫曼树编码过程及原理详解 简介 哈夫曼编码(Huffman Coding)又称霍夫曼编码,是一种数据压缩方法。它是由David A. Huffman于1952年提出的一种编码方法,广泛应用于无损压缩领域。哈夫曼编码是一种前缀编码的变长编码方法,即每个字符的编码不是固定的比特串,而是由可变的比特串组成。它利用字符出现的概率来构建一棵特定的二叉…

    python 2023年5月31日
    00
  • Python实现EXCEL表格的排序功能示例

    下面是Python实现Excel表格的排序功能的完整实例教程,包括两条示例说明。 1. 安装依赖库 在Python中,我们需要用到pandas、xlrd、xlsxwriter这几个库来对Excel表格进行读写和排序。因此,首先需要确保电脑中安装了这几个库。如果尚未安装,则可以通过以下命令来安装: pip install pandas pip install …

    python 2023年5月13日
    00
  • python实现简单成绩录入系统

    Python 实现简单成绩录入系统 1. 设计数据结构 在编写代码之前,我们需要先确定数据结构。对于一个简单的成绩录入系统,我们可以考虑使用字典来存储数据。字典中的键可以是学生姓名,值可以是成绩列表。例如,我们可以将数据结构设计成以下形式: scores = { “张三”: [80, 90, 85], “李四”: [75, 85, 80], “王五”: [9…

    python 2023年5月30日
    00
  • python实现记事本功能

    以下是Python实现记事本功能的完整攻略。 步骤一:创建GUI界面 要实现记事本功能,首先需要创建GUI界面。可以使用Python中内置的Tkinter库来创建GUI界面。 示例代码: import tkinter as tk root = tk.Tk() # 设置窗口大小 root.geometry("500×500") # 设置窗口…

    python 2023年5月19日
    00
  • Python常用模块之threading和Thread模块及线程通信

    Python常用模块之threading和Thread模块及线程通信 简介 Python中可以使用Thread模块和threading模块来创建线程。其中Thread模块是低级模块,用于低级别的线程控制,而threading模块是高级模块,对Thread模块进行了封装,使得线程更加方便使用。本文将对这两个模块进行详细讲解,并讨论线程之间是如何进行通信的。 基…

    python 2023年5月19日
    00
  • Python 利用内置set函数对字符串和列表进行去重的方法

    当我们需要对一段字符串或一个列表进行去重时,可以利用Python内置的set函数实现。set函数会自动去除重复的元素,返回一个新的不包含重复元素的集合。 以下是Python利用内置set函数对字符串和列表进行去重的方法: 1. 对字符串进行去重 假设我们有一个字符串:str1 = “abccdefggaabbcc” 我们要对str1进行去重操作,可以通过以下…

    python 2023年6月5日
    00
  • 使用科大讯飞语音SDK实现文字在线合成语音

    使用科大讯飞语音SDK实现文字在线合成语音需要进行以下步骤: 步骤1:注册和申请应用 首先,前往科大讯飞官网(http://www.xfyun.cn/)进行注册,并创建应用,获取AppID。 步骤2:下载SDK 下载语音合成SDK,SDK支持Windows、Linux、Android平台,具体的下载方式可参考官网:http://www.xfyun.cn/se…

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