Python中的单下划线和双下划线使用场景详解

 更新时间:2019年09月09日 10:09:05   作者:Mr汪  
这篇文章主要介绍了Python中的单下划线和双下划线使用场景详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

单下划线

单下划线用作变量

最常见的一种使用场景是作为变量占位符,使用场景明显可以减少代码中多余变量的使用。为了方便理解,_可以看作被丢弃的变量名称,这样做可以让阅读你代码的人知道,这是个不会被使用的变量,e.g.。

for _, _, filenames in os.walk(targetDir):
  print(filenames)
  
for _ in range(100):
  print('PythonPoint')

在交互解释器比如iPython中,_变量指向交互解释器中最后一次执行语句的返回结果。

单下划线前缀名称(例如_pythonPoint)

  • 这表示这是一个保护成员(属性或者方法),只有类对象和子类对象自己能访问到这些变量,是用来指定私有变量和方法的一种方式(约定而已)。如果使用from a_module import *导入时,这部分变量和函数不会被导入。不过值得注意的是,如果使用import a_module这样导入模块,仍然可以用a_module._pythonPoint这样的形式访问到这样的对象。
  • 另外单下划线开头还有一种一般不会用到的情况,例如使用一个C编写的扩展库有时会用下划线开头命名,然后使用一个去掉下划线的Python模块进行包装。如struct这个模块实际上是C模块_struct的一个Python包装。

单下划线后缀名称

通常用于和Python关键词区分开来,比如我们需要一个变量叫做class,但class是Python的关键词,就可以以单下划线结尾写作class_

双下划线

双下划线前缀名称

这表示这是一个私有成员(属性或者方法)。它无法直接像公有成员一样随便访问。双下划线开头的命名形式在Python的类成员中使用表示名字改编,即如果Test类里有一成员__x,那么dir(Test)时会看到_Test__x而非__x。这是为了避免该成员的名称与子类中的名称冲突,方便父类和子类中该成员的区分识别。但要注意这要求该名称末尾最多有一个下划线。e.g.

双下划线前缀及后缀名称

一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突。是一些Python的“魔术”对象,表示这是一个特殊成员。如类成员的__init____del____add__等,以及全局的__file____name__等。Python官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用Python内置的这些特殊成员。

Python中关于私有属性、方法约定问题,官方文档如下

“Private” instance variables that cannot be accessed except from inside an object don't exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.

Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called name mangling. Any identifier of the form__spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.

Name mangling is helpful for letting subclasses override methods without breaking intraclass method calls.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅谈python新式类和旧式类区别

    浅谈python新式类和旧式类区别

    python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧式类。这篇文章主要介绍了浅谈python新式类和旧式类区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • python机器学习库xgboost的使用

    python机器学习库xgboost的使用

    这篇文章主要介绍了python机器学习库xgboost的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • python 插入Null值数据到Postgresql的操作

    python 插入Null值数据到Postgresql的操作

    这篇文章主要介绍了python 插入Null值数据到Postgresql的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Pandas空值处理全攻略

    Pandas空值处理全攻略

    在进行数据分析和建模时,空值的存在会给结果带来很大影响,本文主要介绍了Pandas空值处理全攻略,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • python not关键字实例用法

    python not关键字实例用法

    在本篇文章里小编给大家整理的是一篇关于python not关键字实例用法,有兴趣的朋友们可以学习下。
    2021-04-04
  • Python爬虫入门有哪些基础知识点

    Python爬虫入门有哪些基础知识点

    在本篇文章中小编给大家整理的是关于Python爬虫入门基础知识点整理,有兴趣的朋友们可以跟着学习下。
    2020-06-06
  • Python调用C语言的方法【基于ctypes模块】

    Python调用C语言的方法【基于ctypes模块】

    这篇文章主要介绍了Python调用C语言的方法,涉及Python基于ctypes模块调用C语言编译后的动态链接库文件相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • tensorflow2 自定义损失函数使用的隐藏坑

    tensorflow2 自定义损失函数使用的隐藏坑

    本文主要介绍了tensorflow2 自定义损失函数使用的隐藏坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • PHP实现发送和接收JSON请求

    PHP实现发送和接收JSON请求

    本篇文章给大家分享了PHP实现发送和接收JSON请求的详细方法和实例代码,有兴趣的朋友可以参考学习下。
    2018-06-06
  • Python中list查询及所需时间计算操作示例

    Python中list查询及所需时间计算操作示例

    这篇文章主要介绍了Python中list查询及所需时间计算操作,涉及Python列表list遍历、查询及时间消耗计算相关操作技巧,需要的朋友可以参考下
    2018-06-06

最新评论