Python中有各种各样的下划线变量与函数,看了很多博客和讲解,但是感觉还是很乱。尤其是有人拿C++中的私有变量一说来解释Python下划线是完全错误的。Python中不存在私有变量(这里的私有变量指不可直接用成员符.来访问),实际上Python中不同位置的下划线有不同的意义。现参照一些自己看过的博客、讲解归纳总结一下:单个下划线用作接收无用变量

例1:

a, _, _ = 1,2,3

print(a)

例2:

for _, val in enumerate(range(4)):

print(val)

2.单(多)个下划线作为模块内的变量(函数、类)名

如果我们在一个模块内定义了下划线开头(无论多少下划线)的变量、函数或类的话,当在别的文件中使用from module import *时,这些下划线变量不会被引用到文件内。

当然事情不是绝对的,以下几种情况还是可以把下划线变量import进来的:使用import module,此时还是可以使用module._name使用下划线变量

使用from module import _name,当然可以了 ^o^

还有一种情况,当module中定义了__all__的话,且__all__中定义了下划线变量,则还是会import进来。(__all__是个魔法属性,它是个用户可以定义的列表,可以在文件中定义它来控制import时引入的变量)

3.类内的下划线开头的变量(函数)名

具体来说分为两种:类内单下划线开头的变量名(包括类变量与实例变量)

类内双下划线开头的变量(函数)名

首先说单下划线:

单下划线变量在没有使用@property 修饰符时,它与一般不带下划线的变量没有任何区别,你可以随意的使用成员运算符.来引用或对它赋值。

当使用@property修饰符修饰后,它将会让人看起来“私有”(本质还是可以被引用和赋值的)。看个例子:

在没有使用@property(一般情况下)时:

class Student():

_school = 'xxxUniversity'

def __init__(self, id):

self._id = id

richard = Student(123)

print(richard._id)

print(richard._school)

结果输出:

123

xxxUniversity

是的,加个下划线就仅仅是为了让它看起来不一样而已。实质跟普通变量没任何区别。

但是如果我们使用了property修饰符的话:

class Student():

_school = 'xxxUniversity'

def __init__(self, id):

self._id = id

@property

def id(self):

print('get id')

return self._id

@id.setter

def id(self, new_id):

print('set id')

if new_id < 0:

pass

else:

self._id = new_id

richard = Student(123)

print(richard._id)

richard.id = 100

print(richard.id)

richard._id = 200

print(richard._id)

结果是:

123

set id

get id

100

200

可以发现,如果使用@property修饰,那么我们在给变量赋值时会调用property内的函数来进行引用和赋值。这可以很方便的让我们在接收数据时做一些“预处理”的工作。

但是它并不是私有,我们还是可以用obj._name的形式来访问到它。这时将绕开property函数。

具体property函数的讲解,可以参照:Python @property​www.programiz.com

接下来是说双下划线开头的类内变量与函数:

这部分参考 @权循真 的回答:双下划线开头的命名形式在 Python 的类成员中使用表示名字改编 (Name Mangling),即如果有一 Test 类里有一成员 __x,那么 dir(Test) 时会看到 _Test__x 而非 __x。这是为了避免该成员的名称与子类中的名称冲突。但要注意这要求该名称末尾没有下划线。

作者:权循真

链接:https://www.zhihu.com/question/19754941/answer/12860775

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4. 魔法方法与魔法属性

像类内的_init__,__new_函数

迭代器中的__iter_, __next__函数

用于自省的__dict_, __class__等变量

包括刚刚提到的__all__

等等。

这些双下划线开头、双下划线结尾的变量或函数在python解释器中有特定的处理方式和机理。除非你知道你在做什么否则不要重写他们。

我是在参考了以下的文章后总结的:Python 的类的下划线命名有什么不同?​www.zhihu.com详解Python中的下划线 - Python - 伯乐在线​python.jobbole.com

python横线怎么打_Python中的各种下划线相关推荐

  1. python怎么打出长下划线_Python 中的各种下划线操作你了解吗?

    原标题:Python 中的各种下划线操作你了解吗? 我们在定义一些变量或者方法的时候,常常会用到下划线.在 Python 中,下划线的出镜率非常高,比如变量,有些是一个下划线开头的(_xx),有些是两 ...

  2. python中的单下划线和双下划线_python中的单下划线和双下划线

    1. _ 的含义在python的类中,没有真正的私有化,不管是方法还是属性,为了编程的需要,约定加了下划线 _ 的属性和方法不属于API,不应该在类的外面访问,也不会被from M import * ...

  3. Python 中5种下划线的含义都是什么?

    今天给大家科普一波,单下划线和双下划线在Python变量和方法名称的含义.有一些含义仅仅是依照约定,被视作提示,而有一些含义是由Python解释器严格执行的.在Python变量和方法名称中各种单下划线 ...

  4. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  5. python中标识符下划线用作开头_python python中那些双下划线开头的那些函数都是干啥用用的...

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  6. python首行缩进_python中缩进

    初识Python 初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法.下面就让我们一起来了解一下Python的编程风格. 1.逻辑行与物理行 在Python中有逻辑 ...

  7. python属性名以两个下划线开头_python python中那些双下划线开头的那些函数都是干啥用用的...

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  8. python类实例化 输入参数名字 下划线_Python 的类的下划线命名有什么不同?

    1,以一个下划线开头的命名 ,如_getFile 2,以两个下划线开头的命名 ,如__filename 3,以两个下划线开头和结尾的命名,如 __init__() 4,其它 这些命名有什么不同吗 首先 ...

  9. python 下划线转驼峰_json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: 原json串: String json= "{'user_name':'ok','user_sex':0,'object_info ...

最新文章

  1. 进击的python【第一集】
  2. 【转】Powerdesigner逆向工程从sql server数据库生成pdm
  3. call()、apply()、bind()
  4. mysql grant查看用户权限命令
  5. maven 国内私服
  6. 5G第一个演进版本标准完成 3GPP宣布R16标准冻结
  7. android图片传输三方框架,Android开发三种第三方图片加载的框架
  8. [转]enable spice html5 console access in openstack kilo(centos)
  9. 一、CXF WebService准备工作
  10. U8系统UFO报表无法打印
  11. HCIA-RS(2019最新题库)
  12. 电阻电容串联并联关系,一辈子受益
  13. [福大软工] Z班——Beta现场答辩反馈
  14. Linux delete folder
  15. easyExcel下载Excel
  16. css3中3D变换的景深和灭点
  17. layui教程(一) form 表单的提交问题
  18. Accessing value from uninitialized register 52,fastJson的坑
  19. U盘安装kali linux
  20. 一次诡异的线上数据库的死锁问题排查过程

热门文章

  1. “华为杯”研究生数学建模竞赛2020年-【华为杯】B题:汽油辛烷值优化建模(附优秀论文)
  2. 旅游网后台管理系统(一)环境搭建
  3. matlab终止运行按什么,matlab终止运行命令
  4. office、Excel、PPT学习笔记
  5. 如何更改word修改时间
  6. android studio菜单自动弹出,Android实现微博菜单弹出效果
  7. TIDB架构自我总结
  8. 页面手写签名插件 jSignature.min.js 使用实例
  9. python GUI 显示图片与文字
  10. $1.2 宏观经济形势