位置: 编程技术 - 正文

浅谈python 里面的单下划线与双下划线的区别(python干嘛用)

编辑:rootadmin

推荐整理分享浅谈python 里面的单下划线与双下划线的区别(python干嘛用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python里s,python的gym,python干嘛用,python有什么含义,python怎么理解,python的gym,谈下python的gil,python怎么理解,内容如对您有帮助,希望把文章链接给更多的朋友!

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

主要存在四种命名

1. object # 公用方法2. __object__ # 内建方法,用户不要这样定义3. __object # 全私有,全保护4. _object # 半保护

核心风格:避免用下划线作为变量名的开始。

因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_object被看作是“私有的”,在模块或类外不可以使用,不能用'from module import *'导入。当变量是私有的时候,用_object来表示变量是很好的习惯。

单下划线+类名,eg:_Class__object 机制就可以访问__object__了。因为变量名__object__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。

“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;”双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。(如下列所示)

以单下划线开头_foo的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的__foo代表类的私有成员;以双下划线开头和结尾的__foo__代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。

从上面的例子可以看出,f._halfprivate_method()可以直接访问,确实是。不过根据python的约定,应该将其视作private,而不要在外部使用它们,(如果你非要使用也没辙),良好的编程习惯是不要在外部使用它。同时,根据Python docs的说明,_object和__object的作用域限制在本模块内。

大家看下面这段程序的输出:

浅谈python 里面的单下划线与双下划线的区别(python干嘛用)

初探

正确的答案是:

A.__private() B.public()

我们分别看下类A和类B的属性都有哪些:

为什么类A有个名为_A__private的 属性呢?而且__private消失了!这就要谈谈Python的私有变量“矫直”了。

Python把以两个或以上下划线字符开头且没有以两个或以上下划线结尾的变量当作私有变量。私有变量会在代码生成之前被转换为长格式(变为公有)。转换机制是这样的:在变量前端插入类名,再在前端加入一个下划线字符。这就是所谓的私有变量矫直(Private name mangling)。如类 A里的__private标识符将被转换为_A__private,这就是上一节出现_A__private和__private消失的原因了。

再讲两点题外话:

一是因为矫直会使标识符变长,当超过的时候,Python会切断,要注意因此引起的命名冲突。

二是当类名全部以下划线命名的时候,Python就不再执行矫直。如:

现在我们回过头来看看为什么会输出“A.__private()”吧!

矫直之后,类A的代码就变成这样了:

因为在类B定义的时候没有覆盖__init__方法,所以调用的仍然是A.__init__,即执行了self._A__private(),自然输出“A.__private()”了。

下面的两段代码可以增加说服力,增进理解:

标签: python干嘛用

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

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

下一篇:Python用户推荐系统曼哈顿算法实现完整代码(基于python的推荐系统)

  • 不动产增值税税率变化
  • 一般 小规模
  • 贸易公司的成本有哪些
  • 待报解预算收入付款怎么做账
  • 临时占用耕地可以种树吗
  • 本年本期累计
  • 货到发票没到
  • 白酒在哪个环节征收消费税
  • 现金股利和股票股利的区别
  • 物业公司收物业费如何入账
  • 17%增值税发票怎么计算成13%
  • 税控盘抵减增值税需要结转吗
  • 公司章程上的出资时间2050年
  • 代扣工资申请怎么写
  • 确认投资收益是按照出资比例还是股权比例
  • 消费税的纳税环节可能有
  • 实收资本印花税是一年一交吗
  • 预缴税款个人所得税如何计算
  • 小区物业宿舍
  • 理财产品属于货币吗
  • 电商企业如何确定产品结构
  • 多付几分钱怎么做账
  • 财产转移数据缴费怎么交
  • 清算结业是什么意思
  • 领取劳保用品如何做凭证怎么做会计分录?
  • 全资子公司合并抵消
  • cmos电池耗尽
  • 债券利息收入的分录
  • 会计主管人员应该具备的基本条件
  • quickres.exe - quickres是什么进程 作用是什么
  • 小规模纳税人纳税期限
  • mac的快捷键在哪
  • 如何通过路由器查看宽带账号密码
  • win11预览版怎么变回正式版
  • php 字符串函数
  • 商业汇票贴现时贴现额的大小受贴现期长短的影响
  • 跨区域涉税事项报告表在哪里打印
  • vue清空页面数据
  • 使用php进行mysql数据库编程的基本步骤
  • 保税进料加工企业
  • 待摊费用在资产负债表中怎么表示
  • 房租发票需要写备注吗
  • 织梦如何添加浮动广告
  • 换电脑了怎么办
  • 印花税计入管理费用还是税金
  • 税控服务费减免会计分录
  • 不得开具增值税专用发票是什么意思
  • 公司注销其他应收款怎么冲平
  • 单位财务报销制度和流程
  • 一般纳税人每月开票不能超过多少
  • 小规模申报表填写模板
  • 分支机构注销后往来账如何处理?
  • 企业每个季度叫什么
  • 劳务费入什么费用
  • 预缴税款是什么税款
  • 低值易耗品属于周转材料吗
  • 装修费用摊销的会计分录怎么写
  • 个税起征点提高的意义
  • 企业送给客户的礼品怎么做分录
  • 逐步测试法计算内含报酬率
  • 事业单位用电收费标准
  • 进口形式发票能证明商品是进口的吗
  • 支票的使用流程图
  • 资本公积其他资本公积用途
  • 新会计制度下五类是什么
  • mysql字符集的作用
  • xp系统找不到搜索功能
  • vista windows
  • 远程查看微信聊天记录软件
  • windows10x预览版
  • centos 7.2安装
  • ControlSet001、ControlSet002以及CurrentControlSet之间有什么区别
  • win7删除开机启动程序
  • 详解IWinter 一个路由转控制器的 Nodejs 库
  • javascript概述及作用
  • 离线安装驱动
  • js中的require用法
  • 如何打印个人所得税证明
  • 欠税务局税款的后果
  • 当前土地增值税优惠政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设