Python __variable__ 或 __method__()的双下划线名称重整”(name mangling)理解

news/2024/4/27 13:49:08/文章来源:https://blog.csdn.net/slowsnowscar/article/details/137112388

双下划线开头和结尾的名称(比如 __variable____method__())是 Python 中的特殊命名约定,通常被称为“双下划线名称重整”(name mangling)。它主要有两个方面的作用:名称修饰和限制访问。

  1. 名称修饰:

    在类定义中,双下划线名称重整用于防止子类意外覆盖父类的属性或方法。当一个类的属性或方法以双下划线开头但不以双下划线结尾时(例如 __variable__method()),Python 会将其重整为 _ClassName__variable_ClassName__method() 的形式。这样做的目的是在子类中防止意外地覆盖父类的属性或方法。

    例如:

class SuperClass:def __init__(self):self.public_attr = "Public Attribute"self.__private_attr = "Private Attribute"def __private_method(self):print("This is a private method.")def public_method(self):print("This is a public method.")self.__private_method()print(self.__private_attr)class SubClass(SuperClass):def __init__(self):super().__init__()self.__private_attr = "Subclass Private Attribute"def __private_method(self):print("This is a subclass private method.")def use_functions(self):self.public_method()# 在子类中访问父类的私有属性和方法print(self._SuperClass__private_attr)self._SuperClass__private_method()print(self.__private_attr)self.__private_method()# 创建子类实例
sub_instance = SubClass()
sub_instance.use_functions()

在这个示例中:

SuperClass 定义了一个公有属性 public_attr、一个私有属性 __private_attr 和两个方法 __private_method()public_method()

SubClass 继承自 SuperClass,并重新定义了 __private_attr__private_method()

在 SubClass 的 use_functions() 方法中,我们调用了父类的 public_method(),并尝试访问父类的私有属性和方法。

由于名称重整的原因,在子类中无法直接访问父类的 __private_attr__private_method()。但是,我们可以使用 _SuperClass__private_attr_SuperClass__private_method() 来访问它们。

运行这个代码,输出结果如下:

This is a public method.
This is a private method.
Private Attribute
Private Attribute
This is a private method.
Subclass Private Attribute
This is a subclass private method.
  1. 限制访问:

    双下划线名称重整也可用于模拟私有成员,即限制对属性和方法的直接访问。虽然在 Python 中没有严格的私有性,但是通过名称重整可以模拟私有成员,使其不容易被外部访问。

    class MyClass:def __init__(self):self.__private_var = 10def __private_method(self):print("This is a private method.")obj = MyClass()
    print(obj.__private_var)  # 会报错,无法直接访问私有变量
    obj.__private_method()  # 会报错,无法直接访问私有方法
    

    在这个例子中,直接访问 obj.__private_varobj.__private_method() 会抛出错误,因为它们被重整为 _MyClass__private_var_MyClass__private_method(),而不是直接的名称。

双下划线名称重整的使用有助于确保代码的健壮性和安全性,尤其在大型项目中。然而,应该注意不要滥用双下划线名称重整,因为它可能会导致代码难以理解和维护。

私有”属性存在两种不同的命名规则(单下划线和双下划线),这一事实引出了一个显而易见的问题:应该使用哪种风格?

  • 对于大部分代码而言,我们应该让非公有名称以单下划线开头
  • 但是,如果我们知道代码中会涉及子类化处理,而且有些内部属性应该对子类进行隐藏,那么此时就应该使用双下划线开头
  • 此外还应该指出的是,有时候可能想定义一个变量,但是名称可能会和保留字产生冲突。基于此,应该在名称最后加上一个单下划线以示区别。比如:
lambda_= 2.0  # Trailing _ to avoid clash with lambda keyword

这里不采用以下划线开头的原因是避免在使用意图上发生混淆(例如,如果采用下划线开头的形式,那么可能会被解释为这么做是为了避免名称冲突,而不是作为私有数据的标志)。在名称尾部加一个单下划线就能解决这个问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026503.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【爬取网易财经文章】

引言 在信息爆炸的时代,获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而,手动浏览网页收集财经文章耗时费力,为了解决这一问题,本文将介绍如何使用Python编写一个爬虫程序来自动爬取网易财经下关于财经的文章 1. 爬…

代码随想录 Day-25

力扣题目 509.斐波那契数 思路 很理所当然的,可以使用递归的方式其次是用动态规划的方式,动态规划的核心就是递推公式。 那么递推和递归一字之差,有什么区别呢?(递推和递归的区别) 1、递归 class Solutio…

Java项目:77 springboot母婴商城

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本课题后端使用SpringBoot Spring Cloud框架,前端采用html,JQuery,JS,DIVCSS技术进行编程&…

Redis中AOF文件重写与同步

AOF文件的写入与同步 Redis服务器进程就是一个时间循环(loop),这个循环中的文件时间负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样需要定时运行的函数。因为服务器在处理文件事件时可能会执行些命令&am…

【Java程序设计】【C00416】基于(JavaWeb)Springboot的客户管理系统(含论文)

基于(JavaWeb)Springboot的客户管理系统(含论文) 项目简介项目获取开发环境项目技术运行截图 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千…

C# 文件操作

文章目录 C# 文件操作创建文件运行结果 写入文件程序文件运行结果 WriteAllLines-写入多行运行结果 追加字符串运行结果追加多行字符串 读取文件ReadAllText运行结果 ReadAllLines-用数组接收读取的内容运行结果 采用流(Stream)的方式来读取内容运行结果…

stm32平衡车

目录 一.所需材料 二.PID算法(简单说明) 直立环 速度环 串级PID 三.使用到的外设 1.定时器输出比较-PWM 2.定时器编码器模式 3.编码器读取速度 4.电机驱动函数 5.外部中断 四、小车 调试 一.所需材料 1.陀螺仪MPU6050--读取三轴的加速度…

C++:梦的开始——创建第一个hello world(1)

我这里使用的编写代码的工具是Start Experimental Instance of Visual Studio 2022 你可以去微软的官网上寻找,并且安装 部署项目 项目就是一个文件夹,他将我们的数据都放到了里面,这就是一个项目 在Visual Studio 2022中 选择c 的空项目&a…

【Linux 08】进程概念

文章目录 🌈 01. 基本概念🌈 02. 描述进程 PCB🌈 03. 使用 ./ 的方式创建进程🌈 04. ps 查看进程🌈 05. getpid / getppid 获取进程标识符🌈 06. kill 终止指定进程🌈 07. fork 创建子进程&…

python学习14:python中的表达式

python中的表达式 1.表达式是什么呢? 表达式就是一个具有明确结果的代码语句,如11、type(‘字符串’)、3*5等 在定义变量的时候,如age108,等号右侧的就是表达式,也就是有具体的结果,将结果赋值给了等号左侧的变量 2.…

Linux 系统基础操作命令

当前市面上常见的系统:Windows、Linux、Mac OS、Android、IOS…… Linux 不太适合日常使用,但是非常适合用于开发。因此作为一个程序猿来说,Linux 都是务必要掌握的。 Linux 介绍 Linux 发行版 目前市面上比较知名的发行版有:R…

DNS隧道攻击

什么是DNS隧道? DNS隧道是一种网络通信技术,它利用DNS(Domain Name System,域名系统)协议来建立隐蔽的通信通道。在正常情况下,DNS协议主要用于将域名解析为IP地址,但攻击者可以通过构造特殊的…

总结 | vue3项目初始化(附相应链接)

如何运行 vue 项目:vscode运行vue项目_vscode启动vue项目命令-CSDN博客 vue3项目搭建 目录管理 git管理:vue3项目搭建并git管理_git 新建vue3项目-CSDN博客 目录调整:vue3项目 - 目录调整-CSDN博客 vscode中快速生成vue3模板&#xff1a…

实现能效升级 | 基于ACM32 MCU的冰箱压缩机变频方案

概述 冰箱制冷系统中最重要的部件是压缩机。它从吸气管吸入低温低压的制冷剂气体,通过电机运转带动活塞对其进行压缩后,向排气管排出高温高压的制冷剂气体,为整个制冷循环提供源动力。这样就实现了压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环…

并查集|1971. 寻找图中是否存在路径、684.冗余连接、685.冗余连接II

目录 并查集基础 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II 并查集基础 并查集主要有三个功能。 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数&#xf…

项目中自动引入神器 - unplugin-auto-import/unplugin-vue-components

前端 项目中 自动引入 神器 前言 在开发中,我们总喜欢站在巨人的肩膀上开发,比如用一些 框架:vue,react, 组件库:element,ant。 工具函数:axios,lodash 现在是模块化时代,我们…

新手入门C语言之联合体和枚举

在上一篇文章中,我们了解到在C语言中,自定义类型有三种,这里我们介绍后两种,联合体和枚举。 一.联合体 1.联合体的声明 像结构体一样,联合体也是由一个或多个成员构成,这些成员的类型可以是不一样的&…

Go——结构体

Go语言中没有类的概念,也不支持类的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。 一. 类型别名和自定义类型 1.1 自定义类型 在Go语言中有一些基本的数据类型,如string,整型,…

手机网页关键词视频爬虫采集软件可导出视频分享链接|视频无水印批量下载工具

全新音视频批量下载工具,为您解放视频管理烦恼! 现如今,音上涌现出大量精彩的视频内容,但是要想高效地获取、管理和分享这些视频却是一件颇具挑战的事情。针对这一难题,我们自主研发了全新的音视频批量下载工具&#x…

数学建模体育建模和经济建模国防科大版

目录 6.体育中的数学建模 7.经济学问题中的数学建模 7.1.实物交换模型 7.2.边际效应 7.3.最佳消费选择模型 6.体育中的数学建模 体育科学的研究中,也有大量的数学建模问题,例如:棒球的最佳击球点问题、滑板滑雪赛道的设计、越野自行车比…