python基础知识_下划线_python下划线前缀_「已注销」的博客-程序员秘密

技术标签: # python基础知识  python  

1. 单前导下划线

  • 单个下划线是一个Python命名约定,表示这个名称是供内部使用的。 它通常不由Python解释器强制执行,仅仅作为一种对程序员的提示。

  • 如果使用通配符从模块中导入所有名称(from unittest import *),则Python不会导入带有前导下划线的名称(除非模块定义了覆盖此行为的__all__列表)

  • 常规导入(eg: from unittest import _fun)不受前导单个下划线命名约定的影响。

2. 单末尾下划线

  • 单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。

3. 双前导下划线

  • 双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。
class Test:
   def __init__(self):
       self.foo = 11
       self._bar = 23
       self.__baz = 23
       

>>> t = Test()
>>> dir(t)
['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_bar', 'foo']

解释:__baz被解释器改写为'_Test__baz'。这样做是为了防止变量在子类中被重写


# 创建另一个扩展Test类的类,并尝试重写构造函数中添加的现有属性
class ExtendedTest(Test):
   def __init__(self):
       super().__init__()
       self.foo = 'overridden'
       self._bar = 'overridden'
       self.__baz = 'overridden'


>>> t2 = ExtendedTest()
>>> t2.foo
'overridden'
>>> t2._bar
'overridden'
>>> t2.__baz
AttributeError: "'ExtendedTest' object has no attribute '__baz'"

>>> dir(t2)
['_ExtendedTest__baz', '_Test__baz', '__class__', '__delattr__',
'__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', '_bar', 'foo', 'get_vars']

>>> t2._ExtendedTest__baz
'overridden'

解释:__baz变成_ExtendedTest__baz以防止意外修改;



4. 双前导和双末尾下划线

  • python自带的有特殊意义的函数, 如

    __init__对象构造函数,或__call__ --- 它使得一个对象可以被调用。
    
  • 最好避免在自己的程序中使用以双下划线(“dunders”)开头和结尾的名称,以避免与将来Python语言的变化产生冲突。

5. 单下划线

  • “_”可作为占位符变量(临时变量);

  • 表示由解释器评估的最近一个表达式的结果。

    >>> 20 + 3
    23
    >>> _
    23
    >>> print(_)
    23
     
    >>> list()
    []
    >>> _.append(1)
    >>> _.append(2)
    >>> _.append(3)
    >>> _
    [1, 2, 3]
    

6. 总结

模式 举例 含义
单前导下划线 _var 命名约定,仅供内部使用。通常不会又python解释器强制执行(通配符导入除外),只作为程序员的提示。
单末尾下划线 var_ 按照约定使用以避免与python关键字的命名冲突,如class_
双前导下划线 __var 当在类上下文中使用时,触发“名称修饰”。由python解释器强制执行。如类Test中定义了__bar这个变量,最终会被解释为_Test__bar
双前导和双末尾下划线 __var__ 表示python语言定义的特殊方法。避免在自己的属性中使用这种命名方式
单独下划线 _ 有时用作临时或无意义变量的名称(“不关心”)。也表示pyhont REPL中最近一个表达式的结果。

7. 参考链接

https://blog.csdn.net/tcx1992/article/details/80105645

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nb6758/article/details/120209876

智能推荐

报名丨边缘计算在产业落地的思考思享会_「已注销」的博客-程序员秘密

图片来源于网络边缘计算在产业落地的思考2019年8月22日2018、2019年边缘计算被全球最大的IT咨询公司Gartner评为十大战略性科技。边缘计算将在对时延、带宽、...

浅谈GCN_gcn的作用_宁静致远wyd的博客-程序员秘密

GCN(Graph convolution Network)是Convets在图结构上的自然推广。卷积神经网络是采用局部感知区域、共享权值和空间域上的降采样,相对于位移、缩放和扭曲,具有稳定不变的特性,能够很好的提取图像的空间特征。图结构不具备图片的平移不变性,传统的卷积方式不适用于图结构。图中每个节点的邻域节点数目不一致,无法用同样尺寸的卷积核进行提取特。而GCN的本质就是提取图的结构...

解决C#+EmguCV播放视频时的内存增长问题_光谷码农的博客-程序员秘密

最近有个C#项目要播放本地视频,想想还是用EmguCV较为方便,然后发现了emgucv的内存管理问题,在播放视频的过程中,内存在一直增加,以为应该有个释放内存的函数啥的,但是在网上搜索半天没有找到结果。于是自己摸索着增加了个垃圾强制回收GC.Collect(),没想到问题就解决了,播放视频内存稳稳的,不再增长,应用到项目中一切正常。 大家有没有遇到这个问题呢? /// <summary> /// 打开文件开始播放 /// &...

ajax的异步与同步以及向上层函数返回值的应用_异步函数中拿到上一级数据_风潇潇1991的博客-程序员秘密

//由于ajax异步的运行方式,在函数中很难向上层函数返回值,但在做登陆页面submit时二次校验以及返回所有校验的判断又是需要的,因而采取输入时校验异步,提交时校验同步将async以参数的形式传递入函数既不影响输入时的用户体验,还实现了提交时校验的功能 function changeImg(){ document.getElementById("checkImg").set

Docker 笔记_angzhan5306的博客-程序员秘密

一、Docker 简介Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台 --Docker HubDocker 使用客户端-服务器 (C/S) 架构模式。Docker 客户端会与 Docker 守护进程进行通信。Docker 守护进程会处理复杂繁重的任务,例如...

如何使用linux命令查看文件路径:_linux查看文件路径命令_稻草人……的博客-程序员秘密

Linux下有两个命令可以查看命令或者文件所在的位置:1.which:which 用来查看当前的命令,执行以后,所在的路径。举个例子:[[email protected] ~]# which python/usr/bin/python意思就是说:如果我直接输入 python ,那么输出的就是 python 命令的默认执行路径 即:/usr/bin/python2.whereis:用来查看...

随便推点

裁员、倒闭和变卖资产:科技业迎来动荡不安的2017年_weixin_34161083的博客-程序员秘密

国外媒体VentureBeat近日刊发评论文章称,2017年刚刚开始,技术行业就陆续传出裁员、关闭和变卖资产的消息,这预示着2017年对于技术行业来说将是动荡不安的一年。文章内容如下:从微软、IBM、Twitter到Zenefits、英特尔和Autodesk,一场“精兵简政”的风暴在2016年席卷了整个技术行业。很多风投支持的初创公司干脆把自己卖了出去...

CentOS7安装iptables防火墙_helloxielan的博客-程序员秘密

为什么80%的码农都做不了架构师?>>> ...

FontAwesome 字体图标 wpf使用_wpyok168的博客-程序员秘密

RegeditWPF 更改成你的项目名称<Application x:Class="RegeditWPF.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:RegeditWPF" StartupUri="MainWindow.xaml" xmlns

HDU 2553 N皇后问题 深搜-dfs_lamborghini1993的博客-程序员秘密

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题是搜索中的经典问题,在N*N的棋盘上放N个皇后,使得每行每列每条对角线上没有两个棋子。代码里面有详细注释,直接上代码。  代码如下:#include #include #include #include #include #include #i

“三星”被围_最骚的就是你的博客-程序员秘密

三星在存储芯片、面板、集成电路代工和手机等诸多领域发展势头强劲,正所谓树大招风,三星的崛起正在使他自己落入美、日、台同行们的“包围”之中。 7月30日,美国苹果公司与韩国三星公司围绕智能手机的专利诉讼开庭,苹果公司提出的索赔额高达25亿美元,并向法院申请销售禁止令,两家公司的这场诉讼很可能重塑产业链。 而就在两个月前,台湾科技首富郭台铭抵押个人股票启动了针对三星的“

docker查看mysql镜像版本_Docker 查看镜像信息_冯定文的博客-程序员秘密

欢迎关注博主的微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 《Java 核心知识整理&面试.pdf》资源链接!!文章首发个人网站: https://www.exception.site/docker/docker-look-up-image-info本文中,我们将需要学习 Docker 如何查看镜像信息?一、images 命令列出镜像通过使用如下两个命令,列出本...

推荐文章

热门文章

相关标签