python-神奇的下划线
2019-12-16 22:45:29
python中下划线有各种各样的作用,本章就来分别介绍一下各种下划线的功能。
一、开头单下划线 _VAR
开头单下划线还是挺常用的,在类中表示为保护变量/保护函数,但是需要注意的是,这个只是一种约定俗成,这不是Python强制规定的。
换言之,你依然可以访问一个类中以单下划线开头的变量或者方法而不报错。
class a:
def __init__(self):
self.a = 1
self._b = 2 def _func(self):
print("Hello world.") if __name__ == "__main__":
aa = a()
print(aa.a)
print(aa._b)
aa._func()
上述的代码运行是完全没有任何的问题的,这是因为Python中的单个下划线前缀仅仅是一个约定 - 至少相对于变量和方法名而言。
但是,前导下划线的确会影响从模块中导入名称的方式。
假设你在一个名为my_module的模块中有以下代码:
# This is my_module.py: def external_func():
return 23 def _internal_func():
return 42
现在,如果使用通配符从模块中导入所有名称,则Python不会导入带有前导下划线的名称:
>>> from my_module import *
>>> external_func()
23
>>> _internal_func()
NameError: "name '_internal_func' is not defined"
当然,如果不是使用通配符进行的导入,那么依然是不会出现任何的问题的,事实上,我们也不建议使用通配符的方式来进行方法的导入。
二、开头双下划线 __VAR
上述的单下划线开头有点类似于君子协定,看到了就是告诉你这个是私有的,不能外部访问的,但是实际上你要外部访问也没辙。但是,开头双下划线的就不一样了,这个在python中有固定的使用方式的。
双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。
python会对以双下划线开头的变量或者方法的name进行重写(_ClassName__VAR),在外部访问的时候如果直接按照变量名访问就会报错。
class Test:
def __init__(self):
self.foo = 11
self._bar = 23
self.__baz = 23 def get_var(self):
print(self.__baz) # 内部可以直接访问 def __method(self):
print("This is method.") if __name__ == "__main__":
a = Test() # print(a.__baz) # AttributeError: 'Test' object has no attribute '__baz'
print(a._Test__baz) # 对内透明
a.get_var() # a.__method() # AttributeError: 'Test' object has no attribute '__method'
a._Test__method()
三、开头末尾双下划线
如果一个名字同时以双下划线开始和结束,则不会应用名称修饰。 由双下划线前缀和后缀包围的变量不会被Python解释器修改:
class PrefixPostfixTest:
def __init__(self):
self.__bam__ = 42 >>> PrefixPostfixTest().__bam__
42
但是,Python保留了有双前导和双末尾下划线的名称,用于特殊用途。 这样的例子有,__init__对象构造函数,或__call__ --- 它使得一个对象可以被调用。
这些dunder方法通常被称为神奇方法 - 但Python社区中的许多人(包括我自己)都不喜欢这种方法。
最好避免在自己的程序中使用以双下划线(“dunders”)开头和结尾的名称,以避免与将来Python语言的变化产生冲突。
python-神奇的下划线的更多相关文章
- Python中的下划线(译文)
原文地址这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 单个下划线(_) 主要有三种情况: 1. 解释器中 _符号是指交 ...
- 详解 Python 中的下划线命名规则
在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...
- Swift——(三)Swift神奇的下划线
在Swift在.有许多神奇的下划线,在这里,我们将看到神奇的汇总,我希望能够帮助其他很多学习Swift朋友. @Author: twlkyao转载或者引用请保留此行. 1.格式化数字字面量 通 ...
- [转]关于python中带下划线的变量和函数的意义
Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...
- Python中的下划线(转)
译文原文:https://segmentfault.com/a/1190000002611411 原文地址这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大 ...
- 关于python中带下划线的变量和函数 的意义
总结: 变量: 1. 前带_的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量 2. 前带两个_ ,后带两个_ 的变量: 标明是内置变量, 3. 大写加下划线的变量: ...
- python 特殊的下划线
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核 ...
- 理解Python的双下划线命名(转)
add by zhj:今天在学习SimpleHTTPServer的源代码时,看到了Python标准库SocketServer模块中有个BaseServer类,该类的__init__方法定义如下 def ...
- python中的下划线
在学习Python的时候,会不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加.在Python中下划线还具有 private 和 protected 类似的访问权限作用,下面我 ...
- 【python】单下划线与双下划线的区别
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 以单下划线开头(_f ...
随机推荐
- [PyTorch入门之60分钟入门闪击战]之自动推倒
AUTOGRAD: AUTOMATIC DIFFERENTIATION(自动分化) 来源于这里. autograd包是PyTorch中所有神经网络的核心.首先我们先简单地了解下它,然后我们将训练我们的 ...
- 会员VS广告:陷入两难抉择的视频网站该如何自救
互联网实在是非常奇妙,其在让一个行业兴起时,却又对传统行业造成严重冲击.比如电商不断创造销售神话,由此成为线下实体店严重萎靡,客流量和销售额直线下降的重要原因之一.但与此同时,因互联网而狂奔的新兴 ...
- 何用Java8 Stream API进行数据抽取与收集
上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据 ...
- PKI详解
预备: 一.密码基元 二.密钥管理 三.PKI本质是把非对称密钥管理标准化 PKI 是 Public Key Infrastructure 的缩写,其主要功能是绑定证书持有者的身份和相关的密钥对(通过 ...
- LLVM 中间代码归纳
Identifiers 标识符 @ 全局 % 局部 后接字符串 命名量 @name %name 无符号数字 未命名量 @42 %42 类型系统 void 空类型 <type> * 指针类型 ...
- 【WPF学习】第五十六章 基于帧的动画
除基于属性的动画系统外,WPF提供了一种创建基于帧的动画的方法,这种方法只使用代码.需要做的全部工作是响应静态的CompositionTarge.Rendering事件,触发该事件是为了给每帧获取内容 ...
- OC和C++混编需要注意的问题
文章首发于github.io 2018-12-17 21:01:55 方案一 1. .c文件的identify and type右边栏修改为Objective-C source 2. Built se ...
- VUE实现Studio管理后台(九):开关(Switch)控件,输入框input系列
接下来几篇作文,会介绍用到的输入框系列,今天会介绍组普通的调用方式,因为RXEditor要求复杂的输入功能,后面的例子会用VUE的component动态调用,就没有今天的这么直观了,控件的实现原理都一 ...
- Yuchuan_Linux_C编程之九目录操作相关函数
一.整体大纲 二.相关函数 1. getcwd 函数作用:获取当前目录 头文件 #include <unistd.h> 函数原型 char *getcwd(char *buf, size_ ...
- Python一键转Jar包,Java调用Python新姿势!
粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...