内容目录

单下划线与双下划线的区别

​ Python用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式:

单下划线(_)

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

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

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

单下划线(_)

​ 只有单划线的情况,主要有两种使用场景:

​ 1、在交互式解释器中,单下划线“_”代表的是上一条执行语句的结果。如果单下划线前面没有语句执行,交互式解释器将会报单下划线没有定义的错误。也可以对单下划线进行赋值操作,这时单下划线代表赋值的结果。但是一般不建议对单下划线进行赋值操作,因为单下划线内建标识符。

"", line 1, in

'_' is not defined

"python"

'python'

'python'

"Java"

'Java'

2、单下划线“_”还可以作为特殊的临时变量。如果一个变量在后面不会再用到,并且不想给这个变量定义名称,这时就可以用单下划线作为临时性的变量。比如对for循环语句遍历的结果元素并不感兴趣,此时就可以用单下划线表示。

# _ 这个变量在后面不会用到

for _ in range(5):

"Python")

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

​ 当在属性和方法前面加上单下划线“_”,用于指定属性和方法是“私有”的。但是Python不像Java一样具有私有属性、方法、类,在属性和方法之前加单下划线,只是代表该属性、方法、类只能在内部使用,是API中非公开的部分。如果用from import * 和 from import * 时,这些属性、方法、类将不被导入。

# Test.py 文件

#普通属性

"Java"

#单下划线属性

"Python"

#普通方法

def  method():

"我是普通方法")

#单下划线方法

def _otherMethod():

"我是单下划线方法")

#普通类

class PClass(object):

def __init__(self):

"普通类的初始化")

#单下划线类

class _WClass(object):

def __init__(self):

"单下划线类的初始化")

​ 将上述的Test.py文件导入,进行测试。

from Test import *

'Java'

"", line 1, in

'_otherValue' is not defined

"", line 1, in

'_otherMethod' is not defined

"", line 1, in

'_WClass' is not defined

​ 从上面的结果可以看出,不管是属性、方法和类,只要名称前面加了单下划线,都不能导出。

​ 如果对程序进行修改,将在开头加入_ all _,结果会是如何?

# Test.py 文件

#将普通属性、单下划线的属性、方法、和类加入__all__列表

"value","_otherValue","_otherMethod","_WClass"]

#普通属性

"Java"

#单下划线属性

"Python"

#普通方法

def  method():

"我是普通方法")

#单下划线方法

def _otherMethod():

"我是单下划线方法")

#普通类

class PClass(object):

def __init__(self):

"普通类的初始化")

#单下划线类

class _WClass(object):

def __init__(self):

"单下划线类的初始化")

​ 将上述修改过的Test.py文件导入,进行测试。

from Test import *

'Java'

'Python'

"", line 1, in

'method' is not defined

"", line 1, in

'PClass' is not defined

​ _ all _是一个字符串列表,不管是普通的还是单下划线的属性、方法和类,都将导出来,使用其他不在这个字符列表上的属性、方法和类,都会报未定义的错误。

​ 不管是属性、方法和类,只要名称前面加了单下划线,都不能导入。除非是模块或包中的“_ all_”列表显式地包含了它们。

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

​ 我们先看看下面的程序:

class Method(object):

# 构造器方法

def __init__(self, name):

# 双下划线属性

# 普通方法

def sayhello(self):

"Method say hello!")

# 双下划线方法

def __sayhi(self):

"Method say hi!")

# 初始化Method

"Python")

# 调用sayhello方法

# 调用sayhi方法

# 输出属性__name

​ 上面的程序定义了一个类,这个类有三个方法,一个构造器方法,一个普通方法,一个双下划线方法,以及包括一个双下划线的属性。上面的结果输出的是什么?很多读者可能认为输出的结果如下:

​ 那么恭喜你,上面的输出结果是错误的,实际输出的结果为:

"", line 18, in

'Method' object has no attribute '__sayhi'

​ 实际上,当对象调用__sayhi()方法时,将会报Method类没有这个方法属性的错误。那如何去调用以双下划线开头的方法和属性?Python这样设计的目的是什么?

​ 首先回答第一个问题,读者看完下面的程序就知道怎么调用了。

class Method(object):

def __init__(self, name):

def sayhello(self):

"Method say hello!")

def __sayhi(self):

"Method say hi!")

# 初始化Method

"Python")

# 调用sayhello方法

# 调用sayhi方法

#m.__sayhi()

# 输出属性__name

#print(m.__name)

​ 输出结果如下:

say hello!

say hi!

​ 我们从上面的程序中可以很清楚的看到,如果要调用以双下划线开头的方法和属性,只要以“类名_方法(属性)”的形式就可以实现方法或者属性的访问了。类前面是单下划线,类名后面是双下划线,然后再加上方法或者属性。但是并不建议调用,因为这是Python内部进行调用的形式。

​ 回答完第一个问题,我们看看第二个问题,Python这样设计的目的是什么?

​ 有很多人认为,Python以双下划线开头的方法和属性表示私有的方法和属性,实际上这样的理解不太准确,也不能说完全错误的。但是这并不是Python设计的目的和初衷,我们先看看下面一段程序和程序运行结果:

class AMethod(object):

def __method(self):

"__method in class Amethod!")

def method(self):

"anthod method in class AMethod!")

class BMethod(AMethod):

def __method(self):

"__method in class Bmethod!")

if __name__=="__main__":

"调用AMethod的method方法")

"调用BMethod的method方法")

​ 上面的程序定义了两个类,一个是AMethod类,另外一个是继承了AMethod类的BMethod类。在AMethod类中,定义了两个方法,一个是以双下划线开头的__method方法,另外一个是普通方法。在BMethod类中,重写了AMethod类中的__method方法。

​ 程序运行结果:

in class Amethod!

anthod method in class AMethod!

BMethod的method方法

__method in class Amethod!

anthod method in class AMethod!

​ 运行结果并不是我们想要的结果,b.method()并没有调用BMethod类的__method方法,而这个设计的实际目的是为了避免父类的方法被子类轻易的覆盖。

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

​ 在Python类中,我们可以常常看到类似于“_ init _ ”的方法,这表示在Python内部调用的方法,一般不建议在程序中调用。比如,当调用len()方法时,实际上调用了 Python中内部的 _ len _ 方法,虽然不建议调用这种以双下划线开头以及结尾的方法,但是可以对这些方法进行重写。比如下面的例子:

class Number(object):

def __init__(self, number):

def __add__(self, number):

# 重写方法,返回两个数的差值

return self.number - number

def __sub__(self, number):

# 重写方法,返回两个数的和

return self.number + number

def __str__(self):

# 重写方法,返回字符串

return str(self.number)

100)

# 100 调用了__str__方法

50) # 50 + 调用了__add__方法

-20) # 120 -调用了__sub__方法

​ 相信看了上面所有对Python中下划线作用的讲解,完全能够理解上述四种下划线所表示的意义。最后将对上面的,进行总结。

总结

单下划线(_): 在交互解释器中,表示上一条语句执行输出的结果。另外,单下划线还可以作为特殊的临时变量,表示在后面将不会在用到这个变量。

名称前的单下划线:只能在内部使用,是API中非公开的部分,不能被 import * 和 from import *导入程序中,除非在all列表中包含了以单下划线开头的属性、方法以及类。

名称前的双下划线:以双下划线开头的属性、方法表示避免父类的属性和方法被子类轻易的覆盖,一般不建议这样定义属性和方法,除非你自己将要做什么。

名称前后的双下划线:这类方法是Python内部定义的方法,你可以重写这些方法,这样Python就可以调用这个重写的方法以及利用操作符。

java双下划线改单下划线_单下划线与双下划线的区别相关推荐

  1. 什么情况下你的工作最为成功_在不倦怠的情况下开始成功学习

    什么情况下你的工作最为成功 How come that one person may learn multiple languages, no matter foreign or programmin ...

  2. 单开双控_单开双控怎么接线

    单开双控怎么接线?单开单控和单开双控的区别是什么呢?作为非专业人士而言,可能对此并不是很了解.不过别担心,下面我就针对这些疑问,来为大家简单介绍下. 单开双控怎么接线 方法很简单,就是先将这2个开关的 ...

  3. 单开双控_什么叫单开双控开关 单控开关和双控开关的区别

    开关是每个家庭都必不可少的建材产品之一,不仅方便日常的生活使用,还能隔离电源,避免危险发生.市面上开关的种类很多,有单控.双控等等.那么很朋友问,什么叫单开双控开关?单控开关和双控开关有什么区别呢?接 ...

  4. 单开双控_什么叫单开双控开关,单控开关与双控开关的区别

    开关是每个家庭都不可缺少的建材产品之一,不仅便利日常的生活使用,还能隔离电源,防止危险再次发生.市面上开关的种类很多,有单控.双控等等.那么很朋友问,什么叫单开双控开关?单控开关和双控开关有什么区别呢 ...

  5. python单链表排序_单链表排序之选择排序

    单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目.单链表排序的关键是交换算法,需要额外考虑.选择排序是比较直观的排序算法之一,这里就使用选择排序实现单链表的排序. C实现代码如下: Li ...

  6. java下拉框读取数据库数据_在一个jsp页面实现二级下拉框联动,实时读取数据库数据...

    在一个jsp(SUN企业级应用的首选)页面实现二级下拉框联动,实时读取数据库数据,这个方法非常使用,只需要修改很小的地方就可以使用.设计的文件,serch.jsp(SUN企业级应用的首选),main. ...

  7. 双离合档把上按钮作用_英特尔展示双屏幕概念笔记本:带有双铰链

    本文转自:IT之家 作者:嗜橙 近日,英特尔在位于圣克拉拉总部深处的一个半秘密实验室里,公布了配备两个屏幕的概念笔记本电脑. 在近日的台北电脑展上,华硕发布了双屏笔记本:不久之后,英特尔也公布了拥有两 ...

  8. 单链表遍历_单链表及其遍历实现的基本操作

    单链表遍历 单链表 (Single linked list) Single linked list contains a number of nodes where each node has a d ...

  9. 双显卡只用独显好吗_「独显和双显」双显卡电脑怎么设置程序默认使用独显? - seo实验室...

    独显和双显 想知道双显卡的电脑该怎么设置默认使用独立显卡呢?下面我们就来看看吸纳关系的教程. 1.在电脑桌面右键点击找到独立显卡的控制面板 2.点击控制面板进入到独立显卡的控制面板,然后开始进行设置 ...

  10. python单链表操作_单链表的创建、增删改查等操作(Python实现)

    单链表的创建.增删改查等操作(Python实现) # 单链表 class Node: def __init__(self, elem): self.elem = elem self.next = No ...

最新文章

  1. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、编写自定义函数在三线表中添加p值
  2. 用模板来进行类型检查。
  3. Python打包程序
  4. python使用笔记:sys.argv[]的使用
  5. Hadoop–Task 相关
  6. 网络产品:思科、H3C 光模块的识别和性能参数讲解
  7. 改变HTML中超链接的显示样式
  8. 软件工程--第三章--需求分析
  9. Java多线程系列--“JUC原子类”
  10. nagios搭建和邮件短信报警设置
  11. 高通路由器(WIFI)芯片处理器IPQ4029介绍
  12. qpython3h数字雨代码,html开发数字雨特效代码
  13. 用python给游戏加上音效_添加声音到你的Python游戏
  14. python分析数据走势图_python数据分析-11数据分析实战案例
  15. 局域网电脑互访的设置大全
  16. 鸿蒙系统国内厂商,谷歌自食其果,华为鸿蒙系统已经被启用,国内厂商或将弃用安卓...
  17. RX 6600XT vs RTX 2060Super 显卡对比
  18. 3 FPGA时序约束理论篇之IO约束
  19. 在移动端设置overflow:hidden禁止滚动的解决方法
  20. filebeat7.7.0相关详细配置预览- Filebeat inputs

热门文章

  1. 《软件困局》内容摘抄
  2. 追求神乎其技的程式设计之道(三)
  3. 高德地图 API 显示跑步路线
  4. iOS 给Xcode模拟器安装IPA包
  5. 乐观锁-基于CAS原理
  6. Docker底层原理
  7. (WPF)360安全卫士9.0界面制作过程
  8. 使用 API 自动生成工具优化前端工作流
  9. c#打开数据库连接池的工作机制_c#数据库连接池的用法
  10. 华为云MetaStudio按下文娱社交行业升级加速键