`

详解Python中的下划线(原创)

 
阅读更多

本文将讨论Python中下划线(_)字符的使用方法。我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已。

单下划线(_)

通常情况下,会在以下3种场景中使用:

1、在解释器中:在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果。这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用。

2、作为一个名称:这与上面一点稍微有些联系,此时“_”作为临时性的名称使用。这样,当其他人阅读你的代码时将会知道,你分配了一个特定的名称,但是并不会在后面再次用到该名称。例如,下面的例子中,你可能对循环计数中的实际值并不感兴趣,此时就可以使用“_”。

3、国际化:也许你也曾看到”_“会被作为一个函数来使用。这种情况下,它通常用于实现国际化和本地化字符串之间翻译查找的函数名称,这似乎源自并遵循相应的C约定。例如,在Django文档“转换”章节中,你将能看到如下代码:

可以发现,场景二和场景三中的使用方法可能会相互冲突,所以我们需要避免在使用“_”作为国际化查找转换功能的代码块中同时使用“_”作为临时名称。

名称前的单下划线(如:_shahriar)

程序员使用名称前的单下划线,用于指定该名称属性为“私有”。这有点类似于惯例,为了使其他人(或你自己)使用这些代码时将会知道以“_”开头的名称只供内部使用。正如Python文档中所述:

以下划线“_”为前缀的名称(如_spam)应该被视为API中非公开的部分(不管是函数、方法还是数据成员)。此时,应该将它们看作是一种实现细节,在修改它们时无需对外部通知。

正如上面所说,这确实类似一种惯例,因为它对解释器来说确实有一定的意义,如果你写了代码“from <模块/包名> import *”,那么以“_”开头的名称都不会被导入,除非模块或包中的“__all__”列表显式地包含了它们。__all__属性由列表构成,它规定了模块的所有可见方法,会使属性列表之外的成员全部私有化。 只有在执行语句 from module import * 时,__all__属性才会起作用。此时所有枚举的成员被import,而其他成员被私有化。

如下例:

# something.py

public_variable = 42
_private_variable = 141

def public_function():
    print("I'm a public function! yay!")

def _private_function():
    print("Ain't nobody accessing me from another module...usually")

class PublicClass(object):
    pass

class _WeirdClass(object):
    pass

 

导入someting模块进行测试>>> from something import *
>>> public_variable
42
>>> _private_variable
...
NameError: name '_private_variable' is not defined
>>> public_function()
"I'm a public function! yay!"
>>> _private_function()
...
NameError: name '_private_function' is not defined
>>> c = PublicClass()
>>> c
<something.PublicClass object at ...>
>>> c = _WeirdClass()
...
NameError: name '_WeirdClass' is not defined

 

显示的指定__all__列表

# something.py

__all__ = ['_private_variable', 'PublicClass']

# The rest is the same as before

public_variable = 42
_private_variable = 141

def public_function():
    print("I'm a public function! yay!")

def _private_function():
    print("Ain't nobody accessing me from another module...usually")

class PublicClass(object):
    pass

class _WeirdClass(object):
    pass

重新导入something模块

>>> from something import *
>>> public_variable
...
NameError: name 'public_variable' is not defined
>>> _private_variable
0
>>> public_function()
...
NameError: name 'public_function' is not defined
>>> _private_function()
...
NameError: name '_private_function' is not defined
>>> c = PublicClass()
>>> c
<something.PublicClass object at ...>
>>> c = _WeirdClass()
...
NameError: name '_WeirdClass' is not defined

名称前的双下划线(如:__shahriar)

名称(具体为一个方法名)前双下划线(__)的用法并不是一种惯例,对解释器来说它有特定的意义。Python中的这种用法是为了避免与子类定义的名称冲突。Python文档指出,“__spam”这种形式(至少两个前导下划线,最多一个后续下划线)的任何标识符将会被“_classname__spam”这种形式原文取代,在这里“classname”是去掉前导下划线的当前类名。例如下面的例子:

正如所预料的,“_internal_use”并未改变,而“__method_name”却被变成了“_ClassName__method_name”。此时,如果你创建A的一个子类B,那么你将不能轻易地覆写A中的方法“__method_name”。

这里的功能几乎和Java中的final方法和C++类中标准方法(非虚方法)一样。

名称前后的双下划线(如:__init__)

这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。

虽然你也可以编写自己的特殊方法名,但不要这样做。

其实,很容易摆脱这种类型的命名,而只让Python内部定义的特殊名称遵循这种约定。

 

参考至:http://python.jobbole.com/81129/
https://shahriar.svbtle.com/importing-star-in-python

http://blog.csdn.net/xlisper/article/details/28722745
http://www.cnblogs.com/stevenlk/p/6245872.html

如有错误,欢迎指正

邮箱:czmcj@163.com

0
1
分享到:
评论

相关推荐

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

    在Python编程语言中,单下划线和双下划线在变量和方法名前后的使用有着不同的含义和用法,它们对于代码的组织和封装有着特定的作用。以下将对Python中单下划线和双下划线的使用场景进行详细解析。 一、单下划线(_...

    Python中的下划线详解

    这篇文章讨论Python中下划线_的使用。跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定。 一、 单个下划线直接做变量名(_) 主要有三种情况: 1. 解释器中 _符号是指交互解释器中...

    详解Python中的函数与对象调用操作

    内容概要:本文深入解析了Python语言环境中调用函数、类方法、构造函数及其相关对象的具体机制。从基础知识入手,涵盖基本的语法形式如定义并触发执行函数体的操作步骤到更深层次的内容诸如利用类构建实例,探讨构造...

    详解python变量与数据类型

    ### 详解 Python 变量与数据类型 #### 变量 在编程中,变量是一个用于存储数据值的基本单元。变量可以被理解为一种容器,用来存放数据或信息。Python 的变量不需要预先声明类型,这使得它成为了一种动态类型语言。...

    python面向对象

    此外,Python还支持私有属性和方法,通过在变量名前加上两个下划线`__`,例如`__private_attribute`。这样的属性和方法在类的外部无法直接访问,但可以通过特殊方法(如`_getattribute_`)进行间接访问,以保护对象...

    详解Python正则表达式库-Re

    正则表达式在Python编程中扮演着重要角色,无论是在数据处理、文本分析还是网页抓取等方面都有广泛的应用。通过学习和掌握正则表达式,开发者能够更高效地处理字符串,提升代码的灵活性和效率。结合实际案例和练习,...

    Python中各种下划线使用总结和实例详解

    Python中的下划线有着特定的语义和使用规则,这些规则在编程实践中起着至关重要的作用,帮助我们更好地组织代码并遵循一定的命名约定。本文将详细介绍Python中的五种下划线用法,并通过实例解析其功能和应用。 1. ...

    Python3导入自定义模块的三种方法详解

    - **模块命名规范**:模块名应遵循Python的标识符规则,通常使用小写字母和下划线,避免使用数字开头和保留关键字。 - **避免命名冲突**:确保你的模块名不会与Python内置模块或标准库中的模块重名,否则可能导致...

    【pythonPHP】Python中函数详解.docx

    ### Python中的函数详解 #### 一、什么是函数 在Python编程语言中,**函数**是一种组织良好的、可重用的代码块,它用于执行特定任务。函数的主要优势在于能够简化程序,提高代码的复用性,并使程序结构更加清晰。 ...

    python中阶基础

    ### Python中阶基础知识点详解 #### 1. Python常识 **1.1. 解释器** - **定义**: 解释器是一种程序,用于读取、分析并执行源代码。 - **Python解释器**: Python有两种主要的解释器实现: - CPython: 使用C语言...

    Python期末试题题库完整-图文word.doc

    【知识点详解】 1. Python 的特性: - **交互式**:Python 支持交互式编程,可以在命令行中逐行输入代码并立即看到结果。 - **解释型**:Python 代码不需要编译,而是边解释边执行,适合快速开发。 - **面向对象...

    python面试题

    ### Python面试题详解 #### Python语言特性 **1. Python的函数参数传递** 在Python中,函数参数的传递实质上是引用的传递。这与C语言中的指针类似,但又有本质的区别。Python中所有变量都是对内存中某个对象的...

    详解python里的命名规范

    在Python编程中,遵循良好的命名规范至关重要,因为它不仅提高了代码的可读性和可维护性,还体现了专业程序员的素养。下面将详细阐述Python中的命名规则和建议。 1. 文件名和包名: - 文件名和包名应全小写,可以...

    详解Python中的变量及其命名和打印

    ### 详解Python中的变量及其命名和打印 #### 变量的概念 在编程语言中,**变量**是一个存储数据值的标识符。通过定义变量,我们可以更直观地管理和操作数据。在Python这样的动态类型语言中,变量不需要事先声明类型...

    Python入门

    ### Python入门知识点详解 #### 一、Python简介 Python是一种高级、通用的编程语言,以其易读性和简洁性著称。Python的设计理念强调代码的可读性和简洁的语法,同时也支持多种编程模式,包括面向对象、命令式、...

    详解Python中的动态属性和特性

    文章的主题是探讨Python语言中动态属性和特性的使用及实现,其中涉及到了Python元编程的介绍以及如何利用动态属性来处理JSON数据。 首先,动态属性是指在运行时能够动态地添加、修改或删除对象的属性。在Python中,...

    浅谈Python中带_的变量或函数命名

    双下划线开头的命名在Python中有着特殊意义,主要用于定义特殊方法。特殊方法是Python内置的一组方法,它们允许开发者自定义类的行为,如对象的创建、初始化等。以下是一些常见的特殊方法示例: - **`__new__()`**...

Global site tag (gtag.js) - Google Analytics