该代码片段来自Django源码(django/forms/forms.py)。这段代码的设计就是errors属性是对外API的一部分,如果你想获取错误详情,应该访问errors属性,而不是(也不应该)访问_get_errors方法。

双下划线开头

之前很多人跟我说Python中双下划线开头表示私有,我在很多地方也见到这样的说法。这样理解可能也不能说错,但这不是Python设计双下划线开头的初衷和目的,Python设计此的真正目的仅仅是为了避免子类覆盖父类的方法。

我们看个例子:

执行结果:

这里有两个点需要注意:

A类中我们定义了__method()、method_x和method()三个方法;然后我们重新定义一个类B,继承自A,并且在B类中覆写(override)了其父类的__method()和method_x方法,但是从输出结果看,B对象调用method()方法时调用了其父类A的__method()方法和自己的method_x()方法。也就是说,__method()覆写没有生效,而method_x()覆写生效了。而这也正是Python设计双下划线开头的唯一目的。

前面我们就说了,Python中不存在真正意义上的私有变量。对于双下划线开头的方法和属性虽然我们不能直接引用,那是因为Python默认在其前面加了前缀_类名,所以就像situation 2下面的代码,虽然我们不能用a直接访问__method(),但却可以加上前缀去访问,即_A__method()。

开头结尾双下划线

一般来说像__this__这种开头结尾都加双下划线的方法表示这是Python自己调用的,你不要调用。比如我们可以调用len()函数来求长度,其实它后台是调用了__len__()方法。一般我们应该使用len,而不是直接使用__len__():

我们一般称__len__()这种方法为magic methods,一些操作符后台调用的也是也是这些magic methods,比如+后台调用的是__add__,-调用的是__sub__,所以这种机制使得我们可以在自己的类中覆写操作符(见后面例子)。另外,有的时候这种开头结尾双下划线方法仅仅是某些特殊场景的回调函数,比如__init__()会在对象的初始化时调用,__new__()会在构建一个实例的时候调用等等。下面我们看两个例子:

在上面这个例子中,我们覆写了+和-操作符,将他们的功能交换了。再看个例子:

这个例子中,因为我们实现了__len__(),所以Room对象也可以使用len函数了。

所有此类的方法都在这里有说明:documentation.

结论使用单下划线(_one_underline)开头表示方法不是API的一部分,不要直接访问(虽然语法上访问也没有什么问题)。

使用双下划线开头(__two_underlines)开头表示子类不能覆写该方法。除非你真的知道你在干什么,否则不要使用这种方式。

当你想让自己定义的对象也可以像Python内置的对象一样使用Python内置的一些函数或操作符(比如len、add、+、-、==等)时,你可以定义该类方法。

当然还有些属性只在末尾加了但下划线,这仅仅是为了避免我们起的一些名字和Python保留关键字冲突,没有特殊含义。

python双下划线怎么打出来_Python中单、双下划线的区别总结相关推荐

  1. python中下划线开头的命名_Python 中各种下划线的骚操作:_、_xx、xx_、__xx、__xx__、_classname_...

    我们在定义一些变量或者方法的时候,常常会用到下划线,在 Python 中,下划线可是很有用处的哟,比如变量,有些是一个下划线开头的(_xx),有些是两个下划线开头的(__xx),有些是在名称的结尾添加 ...

  2. python教学上机实验报告怎么写_Python基础(下)

    不要忘了冒号啊!!!!! 对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量.(我们称此为值传递) 但是对于表来说,表传递给函数的是一个指针,指针指向序列在 ...

  3. python单引号和什么的作用几乎是一样的_Python中单双多引号的用法与区别

    1.一个双引号和三个双引号 一个(对)双引号一般用于引用写在一行的字符串,s1="hello,world." 如果要写成多行,就用连行符: s1="hello,\ #经过 ...

  4. python测试程序的qps和响应时间代码_Python并发请求下限制QPS(每秒查询率)的实现代码...

    前两天有一个需求,需要访问某API服务器请求数据,该服务器限制了QPS=2(哈哈应该都知道是哪个服务器了吧_(:з」∠)_),因为QPS很小所以就使用阻塞式请求.后来开通了服务,QPS提高到了20,阻 ...

  5. python按键盘上哪个键运行_python通过按下键盘特定按键,开始运行python文件

    一.目的 通过按下键盘特定按键,开始运行python文件 二.code from pykeyboard import PyKeyboardEvent from pykeyboard import * ...

  6. python单双三引号区别_python中单引号,双引号,多引号区别_python中单双引号

    python中单引号,双引号,多引号区别 先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行 如: s1 = "hello,world" 如果要写成多行,那么就要使 ...

  7. python获取指定扩展名的文件_python查找目录下指定扩展名的文件实例

    Python 今天小编就为大家分享一篇pytorch nn.Conv2d()中的padding以及输出大小方式,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 ... qq_30468 ...

  8. python 两个冒号是什么成语_python查询双押词

    作为一个妄想成为rapper的porgrammer, 写歌词想不出双押可是个matter, 我又不想每次点开我的browser, 不亲自做点什么哪配当coder! 之前我们学习过jieba分词库,用于 ...

  9. python中单引号和双引号的区别_python中单引号,双引号,多引号区别_python中单双引号...

    python中单引号,双引号,多引号区别 先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行 如: s1 = "hello,world" 如果要写成多行,那么就要使 ...

最新文章

  1. 手机WebAPP设计注意事项和解决方法
  2. buu 大帝的密码武器
  3. 用ASP.net判断上传文件类型的三种方法
  4. mysql中视图的概念_MySql中的视图的概念及应用
  5. android app 移植到pc,微软开发新应用把Android app“移植”到Win Phone
  6. 项目配置不当引发了数据泄露,人已裂开!!
  7. 自定义iOS UIPickerView
  8. NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
  9. 物联网操作系统再思考-共享心跳中心机制(SHBC)
  10. 设计网页录入信息与自己定义server数据接收
  11. 【Java爬虫】接口模拟微信公众号登录,搜索公众号,获取公众号文章,java实现
  12. 工行u盾显示316_企业用户,插U盾点击U盾登录后,显示“无法显示该网页”
  13. 应急响应样本分析查杀集合
  14. 今天刚到货的小米平板2,就出现dnx fastboot mode一直卡死黑屏
  15. c#直接横向打印LocalReport
  16. libvirt零知识学习6 —— libvirt源码编译安装(4)
  17. IIBA - CBAP考试感悟
  18. Latex 论文插入copyright
  19. 拓嘉辰丰电商:拼多多店铺SUK如何设置
  20. SpringBoot 异常后更改响应状态码

热门文章

  1. 切面AOP实现权限校验:实例演示与注解全解(强烈推荐)
  2. OpenCV虚拟画图程序(C++)
  3. 深入分析Java Web技术内幕
  4. 马云最新演讲:20年后,50%的工作会消失,这样做才有机会
  5. Android开发中父类与子类通讯的一个简单实现
  6. 简述u盘安装计算机系统的方法,计算机装系统需要U盘?最简单的方法
  7. 华为云搭建web服务器(WordPress)
  8. ToDoList的实现
  9. c语言百鸡程序,百钱买百鸡C语言程序
  10. 信息收集之 端口扫描