首页 > 编程语言 >python中单下划线与双下划线命名变量的作用与区别

python中单下划线与双下划线命名变量的作用与区别

时间:2022-12-22 21:45:44浏览次数:46  
标签:__ Connector 下划线 python 中单 source timeout main

在python中有一些与下划线相关的约定,这是一个有趣的主题,值得分析分析。对于变量前面有一个下划线,大家都知道这意味着这个变量是类内私有变量,但是奇怪的是这样的类内变量是可以被外部引用的。

class Connector:
    def __init__(self, source) -> None:
        self.source = source
        self._timeout = 60

def main():
    connector = Connector('postgresql://localhost')
    print(connector._timeout) 
    print(connector.__dict__)

if __name__ == '__main__':
    main()

输出

60
{'source': 'postgresql://localhost', '_timeout': 60, 'timeout': 30}

这样就让大家觉得很奇怪,明明是私有的,怎么外部变量也可以访问?这真是个天大的误会,其实这只是个约定的规则,python用这种方式来界定接口与私有属性,这种写法告诉程序员,我们可以安全地重构timeout这个变量而不会影响接口,因为外部不会调用类内私有属性和方法,重构代码时保持接口不变,就不会担心出现连锁反应。实际上,类应该只暴露与外部调用者对象相关的属性和方法,也就是接口指定的属性和方法,对于接口未指定的属性和方法,其名称都应以单下划线的方式开头。
对于以下划线开头的属性和方法不应该在外部调用它,但是在单元测试时,通过外部访问内部属性的方式可以简化测试,这种实用主义的方法可能付出维护性方面的代价。

对于变量有两个下划线的情况,那更是误会发生的地方。

class Connector:
    def __init__(self, source) -> None:
        self.source = source
        self.__timeout = 60

def main():
    connector = Connector('postgresql://localhost')
    print(connector.__timeout) 

if __name__ == '__main__':
    main()

输出

AttributeError: 'Connector' object has no attribute '__timeout'

许多程序员坚定不移,认为这就是私有变量的实现方式,实际不然,返回的错误是没有找到__timeout这个属性,这也就意味着它不是无法访问,而是出现了其它问题。
实际上,对于名称为双下划线开头的变量,python给它重命名为_<类名>__<属性名>,__timeout被重命名成了_Connector__timeout,因此可以这样访问它:

class Connector:
    def __init__(self, source) -> None:
        self.source = source
        self.__timeout = 60

def main():
    connector = Connector('postgresql://localhost')
    print(connector._Connector__timeout) 

if __name__ == '__main__':
    main()

输出

60

这又出现了一个问题,如果双下划线是私有属性的命名方法,那为什么还可以访问到?
实际上,python并不是为了隐藏,而是为了覆盖将被扩展多次的方法,以消除方法名发生冲突的风险,这种理由听起来比较牵强,也不足以证明这种方式是值得的。
使用双下划线并不符合python语言习惯,要将属性定义为私有,请用单下划线,并遵守python约定。

标签:__,Connector,下划线,python,中单,source,timeout,main
From: https://www.cnblogs.com/wlance/p/16999586.html

相关文章

  • 【Python爬虫课程设计】BiliBili UP主数据——绘制数据柱状图和词云
    一、选题的背景1.背景:哔哩哔哩(www.bilibili.com,英文名称:bilibili,简称B站)现为中国年轻世代高度聚集的文化社区和视频平台,该网站于2009年6月26日创建。B站早期是一个ACG(动......
  • Python安装
    1、安装包:https://pan.baidu.com/s/1Y5J_9-RNCpIJK9GfeoJhNA2、下载完成后双击执行下载的exe程序,进入安装界面。安装界面可以选择默认安装,也可以自定义安装,我比较喜欢自定义......
  • Python|文件处理与数据库编程
    某农带专业Python课实验三txt文件处理题目描述:编程新建一个名为test.txt文件,存放在代码文件所在目录中,并且打开该文件。然后写入如图1-1所示内容到文件中。最后分别读......
  • 【Python】羊毛获取小工具
    前言最近沉迷薅羊毛,然后想第一时间得到新的消息。不过说实话第一时间是不存在的,除非跟商家直接对接。于是乎只能靠微博啊,企鹅群等,看别人发的新信息了。那么做一个简单......
  • python mac docx格式转pdf
    1.翻了很多资料发现大多是Windows的库偏多,并且不支持linux,还需要借助word软件,方案是首先docx转html再转pdf代码:frompydocximportPyDocXfromxhtml2pdfimportp......
  • 【python爬虫课程设计】2022-23赛季欧洲冠军联赛——绘制球员数据柱状图和词云
    一、选题的背景1.背景:2022-23赛季欧洲冠军联赛(2022–23UEFAChampionsLeague)由欧洲足球联合会主办的第68届欧洲足球俱乐部的顶级赛事,也是以欧洲冠军联赛名义下的第31届......
  • python爬虫-美团海底捞评论及评分数据爬取和分析
    美团海底捞评论及评分数据爬取和分析一、选题背景  通过网络请求的方式获取响应数据,再对获取的数据进行分析提取和汇总,并储存到xlsx表格中。在进入互联网存储海量数据......
  • centos安装python3
    1:使用CentOS自带的包管理器yum安装新版本的Python。例如,你可以使用以下命令安装最新的Python3版本:sudoyumupdatesudoyuminstallpython32:使用SCL库安......
  • python 数组字典转换
    将提交的数组字段一个字典 [ { "name":"name1", "age":"1", }, { "name":"name2", "age":"2", } ]#变成{ "name":"name1,name2",......
  • python字典转为对象,用"."方式访问对象属性
    python字典转为对象,用"."方式访问对象属性 params={"name":"login","params":{"transaction_id":"cc258bdb3dd4d6bba2","platformTy......