当前位置: 首页 > news >正文

【Python 48小时速成 1】单下划线与双下划线的作用

一、单下划线的使用

在Python中,使用单下划线作为变量名的前缀有着特殊的含义。单下划线在Python中被约定为一个“弱内部使用”标记。这意味着变量名以单下划线开头,表示该变量是类的内部使用,不建议在类外部直接访问。例如:

class MyClass:def __init__(self):self._internal = 0  # 内部变量self.public = 1  # 公共变量def _internal_method(self):pass  # 内部方法def public_method(self):pass  # 公共方法

在上述代码中,变量 _internal 和方法 _internal_method 都以单下划线开头,表示它们是类的内部使用,不建议在类外部直接访问。而变量 public 和方法 public_method 则没有下划线,表示它们是公共的,可以在类外部直接访问。

需要注意的是,使用单下划线作为变量名前缀只是一种约定,Python并不会强制限制对这些变量的访问。所以外部是可以访问以单下划线开头的变量,但这并不符合约定,也不被推荐。

二、双下划线的使用

在Python中,使用双下划线作为变量名的前缀和后缀有着特殊的含义。双下划线在Python中被约定为一个“名称修饰”标记。这意味着变量名以双下划线开头和结尾,表示这是一个特殊的变量,具有特殊的含义。例如:

class MyClass:def __init__(self):self.__private = 10  # 私有变量def __private_method(self):pass  # 私有方法

在上述代码中,变量 __private 和方法 __private_method 都以双下划线开头,表示它们是类的私有成员。私有成员只能在类内部被访问,无法在类外部直接访问。例如,以下代码将会报错:​​​​​​​

obj = MyClass()
print(obj.__private)  # 报错,无法直接访问私有变量
obj.__private_method()  # 报错,无法直接调用私有方法

然而,Python并没有像其他编程语言一样严格限制私有成员的访问。实际上,Python通过一种名为“名称修饰”的机制,将双下划线开头的变量名进行了变换。例如,变量__private在类内部被重命名为_MyClass__private,方法__private_method在类内部被重命名为_MyClass__private_method。因此,实际上可以通过这种方式来访问私有成员:​​​​​​​

obj = MyClass()
print(obj._MyClass__private)  # 访问重命名后的私有变量
obj._MyClass__private_method()  # 调用重命名后的私有方法

需要注意的是,虽然可以通过名称修饰的方式访问私有成员,但这并不符合Python的编码规范,也不被推荐。Python鼓励开发者通过约定来限制对私有成员的访问,而不是通过强制限制。

三、头尾双下划线的使用

在Python中,以双下划线开头和结尾的变量名具有特殊的含义,被称为“魔术方法”或“特殊方法”。这些特殊方法用于实现类的特殊行为,例如构造函数、析构函数、字符串表示等。例如:​​​​​​​

class MyClass:def __init__(self):pass  # 构造函数def __del__(self):pass  # 析构函数def __repr__(self):pass  # 字符串表示def __str__(self):pass  # 字符串表示

在上述代码中,__init____del____repr____str__都是特殊方法,用于实现类的特殊行为。这些特殊方法在特定的时机被自动调用,无需手动调用。

例如,__init__方法是构造函数,用于在对象创建时进行初始化操作。当创建一个类的实例时,构造函数会被自动调用:

obj = MyClass()  # 自动调用构造函数

需要注意的是,特殊方法的名称是由Python预先定义的,无法修改。开发者只需要按照特定的方法名和参数列表来实现特殊方法即可。

结语:

本文详细介绍了Python中的单下划线、双下划线和头尾双下划线的使用教程。单下划线用于表示“弱内部使用”,双下划线用于表示“名称修饰”,头尾双下划线用于表示“特殊方法”。通过了解和应用这些下划线的特性,开发者可以更好地编写Python代码,提高代码的可读性和可维护性。希望本文对读者有所帮助,让你更加深入地理解Python中下划线的使用。

相关文章:

  • 读算法的陷阱:超级平台、算法垄断与场景欺骗笔记14_友和敌
  • EDI在汽车主机厂配送流程中的应用
  • 深度学习_ResNet_5
  • 绝地求生:受到封禁三天的玩家,静待解封即可!官方暂未发布系误封公告
  • flask 继续学习
  • 完美解决 git报错fatal: unable to access ‘https://github.com/.../.git‘:Recv failure Connection was reset
  • 卷积篇 | YOLOv8改进之C2f模块融合SCConv | 即插即用的空间和通道维度重构卷积
  • 常用的gpt网站
  • 【Unity每日一记】unity中的内置宏和条件编译(Unity内置脚本符号)
  • JVM中对象创建过程
  • 【FPGA/IC】什么是模块化设计?
  • Html+threejs数字孪生三维场景实现
  • 数据结构—稀疏多项式相加
  • Docker部署TeamCity来完成内部CI、CD流程
  • ChatGPT是什么,怎么使用,需要注意些什么?
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Babel配置的不完全指南
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • PAT A1092
  • react-native 安卓真机环境搭建
  • SQLServer之索引简介
  • Theano - 导数
  • Vue ES6 Jade Scss Webpack Gulp
  • Web设计流程优化:网页效果图设计新思路
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 猴子数据域名防封接口降低小说被封的风险
  • 前端技术周刊 2019-01-14:客户端存储
  • 全栈开发——Linux
  • 入门到放弃node系列之Hello Word篇
  • 我这样减少了26.5M Java内存!
  • 小程序button引导用户授权
  • 大数据全解:定义、价值及挑战
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​Java并发新构件之Exchanger
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​用户画像从0到100的构建思路
  • (4)(4.6) Triducer
  • (6)STL算法之转换
  • (转)jdk与jre的区别
  • (转)ObjectiveC 深浅拷贝学习
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • . NET自动找可写目录
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net 垃圾回收机制原理(二)
  • .NET中的Exception处理(C#)
  • :中兴通讯为何成功
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ C++ ] STL---stack与queue
  • [ 蓝桥杯Web真题 ]-布局切换
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [C++]C++入门--引用