位置: 编程技术 - 正文

Python中单、双下划线的区别总结(python中的单下划线和双下划线)

编辑:rootadmin

推荐整理分享Python中单、双下划线的区别总结(python中的单下划线和双下划线),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python中的单下划线和双下划线,python判断单双,python 单下划线和双下划线变量,python中单下划线_foo与双下划线,python中单下划线_foo与双下划线下列说法正确,python单双下划线的区别,python中单下划线_foo与双下划线下列说法正确,python单双下划线的区别,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

Python 的代码风格由 PEP 8 描述。这个文档描述了 Python 编程风格的方方面面。在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格。这样就易于阅读,易于在程序员之间交流。

我们大家在学习Python的时候,好像很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像__this__这种。在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数的大小写一样,或是一些其他语言中的private、public的作用一样,但仔细深究,这不全是Python这样设计的初衷。

下面我们具体分析,话不多说了,来一起看看吧。

单下划线开头

我们经常看到方法或者属性前面加了单下划线,并认为它表示该方法或者属性是该类型(Python和Golang一样,不光类可以有方法,很多类型甚至基本类型也可以定义方法)的私有方法或属性。但其实在Python中不存在真正意义上的私有方法或者属性,前面加单下划线_只是表示你不应该去访问这个方法或者属性,因为它不是API的一部分。

举个例子:

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

双下划线开头

之前很多人跟我说Python中双下划线开头表示私有,我在很多地方也见到这样的说法。这样理解可能也不能说错,但这不是Python设计双下划线开头的初衷和目的,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官方说明中得到答案: 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保留关键字冲突,没有特殊含义。

注:本文大部分内容参考自Difference between _ , and __xx in Python .

总结

标签: python中的单下划线和双下划线

本文链接地址:https://www.jiuchutong.com/biancheng/377032.html 转载请保留说明!

上一篇:从CentOS安装完成到生成词云python的实例(centos安装完成后桌面没有图标)

下一篇:vscode 远程调试python的方法(vscode 远程调试jni)

  • 企业收取的租金应当计入
  • 金税盘锁死日期是16号,16号能清卡吗
  • 纳税人规模证明是什么
  • 公司替个人交的水电费计入哪里了
  • 财务软件怎么结转本年利润
  • 管理费用怎么结转成本
  • 员工单独购买工伤保险可以吗
  • 企业所得税1季度申报季初从业人数个税所属期12月
  • 抵债资产账务处理2021年
  • 提前给货款计入什么科目
  • 进口材料支付的关税
  • 企业所得税为什么那么高
  • 计提未发放的工资是否交个税
  • 增值税发票收款人复核人空白可以吗
  • 税收编码名称是什么
  • 陈列费发票属于什么类型
  • 建筑业企业包括哪些企业
  • 交防伪税控技术怎么交
  • 开票满500万一定会升一般纳税人吗
  • 企业向境外支付货款填写
  • 未确认收入的增值税怎么记账
  • 上月抵扣的进项税这个月怎么做分录
  • 调整以前年度企业所得税会计分录
  • 五险一金的记账凭证怎么填写
  • 删除文件时错误是怎么回事
  • 期初未缴纳税额负数
  • 记账金额如何处理账户
  • 间接费用是什么费用
  • 上个月做的无票收入,这个月开票怎样做分录
  • 股权和债权有无区别
  • 私车公用维修费属于个人承担吗
  • 支付赊购材料款怎么入账
  • 关于减肥的好方法
  • Honeybee flying over crocuses in the Tatra Mountains, Poland (© Mirek Kijewski/Getty Images)
  • 解决脱发的8个方法
  • Vue+Element UI-el-date-picker时间日期选择器组件(实现向后端传值)
  • 尚融资本
  • javascript核心技术
  • python中拼接
  • python字典怎么添加值
  • 成品油发票是什么样的
  • mongodb分片技术
  • 购买的烟酒怎么入账
  • 应收账款属于供应商还是客户
  • 联营企业与合营企业纳入合并吗
  • 业务招待费专票可以抵扣吗
  • 所得税季报中的营业收入包括营业外收入吗
  • 定期定额户增值税起征点
  • 费用暂估入账后期如何冲销
  • 研发费用加计扣除的条件
  • 固定资产报废的账务处理
  • 房产契税什么时候退税
  • 物业公司代收代付租金要开发票吗
  • 公司购买的五金怎么入账
  • 出口退税免抵退税额要交城建税吗
  • 商业汇票的会计科目是什么
  • 公司章程进行变更的条件
  • 培训发票能抵扣吗
  • 单利率和复利率公式
  • 没有到位的注资公司
  • 环保局罚款记什么科目
  • 小型便利店靠什么进行营利
  • 原材料科目怎么设置
  • mysql数据库查看是否区分大小写
  • windows 9x
  • 受限怎么解除
  • uca1
  • windows8应用商店用不了
  • cocos2dx4.0教程
  • csh,tcsh,bash,sh等shell的区别
  • css position: absolute、relative详解
  • 置顶pyq会被自己屏蔽的人看到吗
  • wordpress单页面店铺
  • JavaScript window.document的属性、方法和事件小结
  • android:padding="10dp"
  • googlevoice使用教程
  • 海南国税局待遇
  • 广州市国家税务局稽查局举报中心
  • 福建 退休
  • 电力营销岗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设