Python

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

l

单下划线(

_

)

l

名称前的单下划线(如:

_name

)

l

名称前的双下划线(如:

__name

)

l

名称前后的双下划线(如

:__init__

)

(一)

单下划线(

_

)

只有单

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

1

、在交互式解释器中,单下划线“

_

”代表的是上一条执行语句的结果。如果单下划线前面没有语句执行,

那么

交互式解释器将会报单下划线没有定义的错误。也可以对单下划线进行赋值操作,这时单下划线代表赋值的结果。但是一般不建议对单下划线进行赋值操作,因为单下划线内建标识符。

>>> _

Traceback (most recent call last):

File "", line 1, in

_

NameError: name '_' is not defined

>>> "python"

'python'

>>> _

'python'

>>> _="Java"

>>> _

'Java'

>>>

2

、单下划线“

_

”还可以作为特殊的临时变量。如果一个变量在后面不会再用到,并且不想给这个变量定义名称,

那么

这时就可以用单下划线作为临时性的变量。

例如,

for

循环语句遍历的结果元素并不感兴趣,此时就可以用单下划线表示。

# _

这个变量在后面不会用到

for _ in range(5):

print("Python")

(二)

名称前的单下划线(如:

_name

)

当在属性和方法前面加上单下划线

_

”,用于指定属性和方法是“私有”的。但是

Python

不像

Java

一样具有私有属性、方法、类,在属性和方法之前加单下划线,只是代表该属性、方法、类只能在内部使用,是

API

中非公开的部分。如果用

from import *

from import *

时,这些属性、方法、类将不被导入。

# Test.py

文件

#

普通属性

value="Java"

#

单下划线属性

_otherValue="Python"

#

普通方法

def  method():

print("

我是普通方法

")

#

单下划线方法

def _otherMethod():

print("

我是单下划线方法

")

#

普通类

class PClass(object):

def __init__(self):

print("

普通类的初始化

")

#

单下划线类

class _WClass(object):

def __init__(self):

print("

单下划线类的初始化

")

将上述的

Test.py

文件导入,进行测试。

>>> from Test import *

>>> value

'Java'

>>> _otherValue

Traceback (most recent call last):

File "", line 1, in

_otherValue

NameError: name '_otherValue' is not defined

>>> method()

我是普通方法

>>> _otherMethod()

Traceback (most recent call last):

File "", line 1, in

_otherMethod()

NameError: name '_otherMethod' is not defined

>>> p=PClass()

普通类的初始化

>>> w=_WClass()

Traceback (most recent call last):

File "", line 1, in

w=_WClass()

NameError: name '_WClass' is not defined

从上面的结果可以看出,不管是属性、方法和类,只要

名称前面加了单下划线,都不能导出。如果对程序

Test.py

进行修改,在

文件

开头加入

__all__

结果会是如何?

#

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

__all__

列表

__all__=["value"

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

修改后继续测试:

>>> from Test import *

>>> value

'Java'

>>> _otherValue

'Python'

>>> method()

Traceback (most recent call last):

File "", line 1, in

method()

NameError: name 'method' is not defined

>>> _otherMethod()

我是单下划线方法

>>> p=PClass()

Traceback (most recent call last):

File "", line 1, in

p=PClass()

NameError: name 'PClass' is not defined

>>> w= _WClass()

单下划线类的初始化

__all__

是一个字符串列表,不管是普通的还是单下划线的属性、方法和类,都将导出来,使用其他不在这个字符列表上的属性、方法和类,都会报未定义的错误。不管是属性、方法和类,只要名称前面加了单下划线,都不能导入。除非是模块或包中的“

__all__

”列表显式地包含了它们。

(三)

名称前的双下划线(如:

__name

)

先看看下面的程序:

class Method(object):

#

构造器方法

def __init__(self, name):

#

双下划线属性

self.__name = name

#

普通方法

def sayhello(self):

print("Method say hello!")

#

双下划线方法

def __sayhi(self):

print("Method say hi!")

#

初始化

Method

m = Method("Python")

#

调用

sayhello

方法

m.sayhello()

#

调用

sayhi

方法

m.__sayhi()

#

输出属性

__name

print(m.__name)

上面的程序定义了一个类,这个类有三个方法,一个构造器方法,一个普通方法,一个双下划线方法,以及包括一个双下划线的属性。上面

输出结果

Method say hello!

Traceback (most recent call last):

File "", line 18, in

AttributeError: 'Method' object has no attribute '__sayhi'

实际上,当对象调用

__sayhi()

方法时,将会报

Method

类没有这个方法属性的错误。那如何去调用以双下划线开头的方法和属性?

Python

这样设计的目的是什么?

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

class Method(object):

def __init__(self, name):

self.__name = name

def sayhello(self):

print("Method say hello!")

def __sayhi(self):

print("Method say hi!")

#

初始化

Method

m = Method("Python")

#

调用

sayhello

方法

m.sayhello()

#

调用

sayhi

方法

#m.__sayhi()

m._Method__sayhi()

#

输出属性

__name

#print(m.__name)

print(m._Method__name)

输出结果如下:

Method say hello!

Method say hi!

Python

从上面的程序中可以很清楚的看到,如果要调用以双下划线开头的方法和属性,只要以

_

类名

__

方法(属性)”的形式就可以实现方法或者属性的访问了。类前面是单下划线,类名后面是双下划线,然后再加上方法或者属性。但是并不建议调用,因为这是

Python

内部进行调用的形式。

回答完第一个问题,我们看看第二个问题,

Python

这样设计的目的是什么?

有很多人认为,

Python

以双下划线开头的方法和属性表示私有的方法和属性,实际上这样的理解不太准确,也不能说完全错误的。但是这并不是

Python

设计的目的和初衷,我们先看看下面一段程序和程序运行结果

:

class AMethod(object):

def __method(self):

print("__method in class Amethod!")

def method(self):

self.__method()

print("anthod method in class AMethod!")

class BMethod(AMethod):

def __method(self):

print("__method in class Bmethod!")

if __name__=="__main__":

print("

调用

AMethod

method

方法

")

a = AMethod()

a.method()

print("

调用

BMethod

method

方法

")

b = BMethod()

b.method()

上面的程序定义了两个类,一个是

AMethod

类,另外一个是继承了

AMethod

类的

BMethod

类。在

AMethod

类中,定义了两个方法,一个是以双下划线开头的

__method

方法,另外一个是普通方法。在

BMethod

类中,重写了

AMethod

类中的

__method

方法。

程序运行结果:

调用

AMethod

method

方法

__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):

self.number = number

def __add__(self, number):

#

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

return self.number - number

def __sub__(self, number):

#

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

return self.number + number

def __str__(self):

#

重写方法,返回字符串

return str(self.number)

num = Number(100)

print(num) # 100

调用了

__str__

方法

print(num+50) # 50 +

调用了

__add__

方法

print(num-20) # 120 -

调用了

__sub__

方法

相信看了上面所有对

Python

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

(五)

总结

l

单下划线(

_

)

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

l

名称前的单下划线:只能在内部使用,是

API

中非公开的部分,不能被

import

*

from

import

*

导入程序中,除非在

__all__

列表中包含了以单下划线开头的属性、方法以及类。

l

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

l

名称前后的双下划线:这类方法是

Python

内部定义的方法,可以重写这些方法,这样

Python

就可以调用这个重写的方法以及利用操作符。

About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

........................................................................................................................

● QQ群号:

230161599

(满)

、618766405

● weixin群:可加我weixin,我拉大家进群,非诚勿扰

● 联系我请加QQ好友

(

646634621

)

,注明添加缘由

● 于 2019-01-01 06:00 ~ 2019-01-31 24:00 在魔都完成

● 最新修改时间:2019-01-01 06:00 ~ 2019-01-31 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

........................................................................................................................

使用

weixin客户端

扫描下面的二维码来关注小麦苗的weixin公众号(

xiaomaimiaolhr

)及QQ群(DBA宝典)、添加小麦苗weixin,

学习最实用的数据库技术。

........................................................................................................................

python前后双下划线_【Python】单下划线与双下划线的区别相关推荐

  1. 双有源桥DC变换器单移相,双移相控制simulink仿真模型

    双有源桥DC变换器单移相,双移相控制simulink仿真模型 编号:7449646202122558P17696131442

  2. python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)

    [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...

  3. 四全集学python选哪种电脑_“Python教程哪个版本最适合学习?“python教程全集

    python教程,求一套比较好的python教程 好不好主要先看你自己,理解能力样,有没有接触过编程,有没础,这很重要: 看教程,能不能先给你建立起知识体系框架,许多教程一上来就直接给你灌输知识很让人 ...

  4. 双路cpu比单路强多少_电源单路好还是双路好?电脑电源单路和双路12V详细区别对比...

    在一些比较大功率的电源中,经常可以看到分为单路12V和双路甚至是多路12V两种规格.那么,电源单路好还是双路好呢,很多网友搞不清这个问题.下面"脚本之家"以最通俗易懂的描述,带大家 ...

  5. python批量修改excel数据_/python批量修改excel工作薄

    你好,怎么用Python对一个文件夹里包含多个Excel子文件进行批量修改某一单元格(是合并的)? 工作中经常用到Excel多事情都重复处理,比如每日报,每周的周报,各种数据表,这种固定的表其实都是6 ...

  6. python如何设置字体大小_[Python Basic]如何设置 Python 的运行环境

    一如既往地, 咱们不仅仅是学习 Python 的基础知识, 同时, 也按照2/8 规律学习关键知识的关键部分 - python 核心词汇 如何安装 Python 下载 Python 打开网址:http ...

  7. python小软件制作教程_[Python]手把手教程:Python制作番茄钟

    这篇文章是根据Udacity的免费课程 编程基础:Python所做的笔记,适合零基础学习Python 我们先了解这个番茄钟的概念,就是每隔一段固定的时间就提醒你休息一下,可能是播放一段音乐, 弹出一个 ...

  8. python如何检验显著性差异_[Python] 如何证明两组样本有显著性差异(t-test假设检验) | 学步园...

    现有两组样本数据,假如它们分别基于两套不同的方法,或者测于不同的设备,又或是出自两个人之手,如何证明它们有或没有显著性差别呢?当然可以拿个Excel表把数据画个图,然后找一堆人来投票,看觉得差不多还是 ...

  9. 不同坐标系下角速度_悠悠球的物理学原理(下)

    悠悠球的物理学原理(上) 接着上周的故事,让我们继续悠悠球的探索之旅-- 01稳定性与性能指标 现在的悠悠球运动有五大类的花式,感兴趣的朋友可以了解一下.不同门类花式的性能指标不尽相同.本文主要讲的是 ...

  10. element做树形下拉_一个基于 elementUi的vue树形下拉框组件

    # wl-vue-select,wl-tree-selectcss # 简介vue 用于vue框架的树形下拉框及带全选的普通下拉框.   node Tree drop-down box for vue ...

最新文章

  1. 在CentOS 6.6 64bit上为vim 7.4安装并配置vim-airline插件
  2. 建立你的第一个 Git 仓库
  3. Hibernate从零开始_07_多对多关系(中间表)
  4. C# 指定Webbrowser控件所用IE内核版本
  5. python语言用法_python语言基本语句用法总结(1.)
  6. P3698-[CQOI2017]小Q的棋盘【树形dp】
  7. (待定系数法)A/B
  8. 2字段添加注释_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  9. 不规则物体形状匹配综述
  10. C#.NET常见问题(FAQ)-如何改变字符串编码
  11. CCIE试验备考之交换security
  12. JSON 之 SuperObject(3): 访问
  13. My97DatePicker JS时间控件 当前日期前后不能选
  14. 阶段3 1.Mybatis_12.Mybatis注解开发_8 mybatis注解开发使用二级缓存
  15. c语言汇率兑换小程序,不懂算汇率?推荐你3个计算汇率的小程序,让你轻松算汇率...
  16. 如何在Mac上自定义文件和文件夹图标?看这里
  17. 关于PHP=5.5时密码哈希校验的使用案例
  18. 分治法 循环比赛日程表
  19. 清华校友、香港科技大学准博士ICCV顶会论文被爆公然抄袭!去年CVPR也是抄的...
  20. 封号、扣钱:谁来保证专车司机的利益?

热门文章

  1. 联想手机android 通讯同步,手机同步助手乐同步(Android)面世
  2. 2023上海锂电池技术展览会|新能源动力电池及储能电池博览会|长三角锂电池材料设备展会
  3. 指定python pip源
  4. 如何证明一个问题是NP-hard(NP-complete)
  5. 【读书笔记】《干法》
  6. 网易云音乐爬虫超简单,告别会员享受听觉盛宴
  7. GoogleTest从入门到入门,小白都能看懂的gtest详细教程
  8. vue3的pinia(大菠萝)
  9. 【云原生】基于Kubernetes开发的阿里云ACK之可观测监控
  10. 从零开始做循迹小车-1-基础篇-红外灰度传感器