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

yizhihongxing

下面我来详细讲解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日

相关文章

  • 浅谈用VSCode写python的正确姿势

    下面是关于“浅谈用VSCode写Python的正确姿势”的完整攻略。 1. 安装 VSCode 首先,需要下载并安装 Visual Studio Code。可以从官方网站下载 https://code.visualstudio.com/。 2. 安装 Python 扩展 在安装完 VSCode 后,需要在扩展中心中搜索并安装 Python 扩展。可以通过在 …

    python 2023年5月18日
    00
  • 剖析Python的Tornado框架中session支持的实现代码

    要剖析Python的Tornado框架中session支持的实现代码,我们可以分为以下几个步骤: Step 1:了解Tornado框架的session支持 在Tornado框架中,session可以通过get_secure_cookie和set_secure_cookie函数来实现。其中,set_secure_cookie可以将session信息加密存储在c…

    python 2023年6月2日
    00
  • Python中列表、字典、元组数据结构的简单学习笔记

    Python中列表、字典、元组数据结构的简单学习笔记 列表(List) 列表是一种有序的数据类型,可以将一系列的元素按照顺序排列,并且每个元素可以是不同的数据类型。 创建列表 在Python中可以使用方括号 [] 来定义一个列表,并且列表中的元素之间使用逗号 , 进行分隔开。例如: list1 = [1, 2, 3, 4, 5] list2 = [‘appl…

    python 2023年5月14日
    00
  • Python基于pygame实现的弹力球效果(附源码)

    Python基于pygame实现的弹力球效果攻略 简介 此次攻略主要介绍通过基于pygame实现弹力球效果的过程,可以让大家对pygame进行更深入的了解,同时也可以帮助大家更深入的学习Python游戏开发相关的知识点。 步骤 首先,需要安装pygame模块,可以通过以下命令进行安装(需要确保已安装pip工具): pip install pygame 在安装…

    python 2023年6月13日
    00
  • Python实现无损放大图片的示例代码

    针对这个主题,以下是我对应的完整攻略: Python实现无损放大图片的示例代码 什么是无损放大? “无损放大”是指在不损失图片质量的情况下,将图片进行放大操作,使图片的分辨率变高。与之相对的是“有损放大”,也就是通过插值等技术进行放大,但是在过程中会丢失部分原本的图片信息,导致放大后的图片像素不清晰或出现锯齿等。 实现方法 Python的pillow库提供了…

    python 2023年5月19日
    00
  • python+opencv实现的简单人脸识别代码示例

    安装Python和OpenCV 首先需要在计算机上安装Python和OpenCV,安装方法可以参照官方文档进行。 引入需要的库和模块 在Python程序的开头,需要引入需要的库和模块,例如: import cv2 import numpy as np 其中,cv2就是OpenCV所提供的Python接口模块,numpy模块用于处理数值计算。 读取并处理图像 …

    python 2023年5月18日
    00
  • python爬虫爬取笔趣网小说网站过程图解

    Python爬虫爬取笔趣网小说网站过程图解 1. 了解爬虫基本原理 Python爬虫是指使用Python程序对网站进行自动化数据采集的过程。其基本原理为模拟浏览器的行为向网站发送请求,获取网站的HTML页面内容,然后解析出需要的数据。在实现Python爬虫之前,需要掌握以下几个方面: HTTP协议的基本知识; Python基本语法; 正则表达式的使用; Xp…

    python 2023年5月14日
    00
  • Python文件目录操作常用模块的使用详解

    Python文件目录操作常用模块的使用详解 介绍 在Python中,我们常常需要对文件与目录进行操作,例如创建新文件、删除文件、获取文件列表、复制等操作。Python提供了一系列的模块用来实现这些常用的文件目录操作。本文就对这些模块进行详细的说明与示例演示。 操作文件 Python内置的os模块提供了文件操作相关的函数。下面是其中一些常用的函数: 文件读写 …

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