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 ...
随机推荐
- ES Templates push
{ "order": 0, "template": "connector-connection*", "settings" ...
- 给文本中的url加超级链接,同时滤过已加过链接的url
/** * 给文本中的url加超级链接,同时滤过已有链接的url * @param string $str [description] * @return [type] [description] * ...
- Android下的定时任务
Android中的定时任务一般有两种实现方式,一种是使用JavaAPI里的Timer类,另一种是使用android的Alarm机制. 这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显的 ...
- MYSQL对数据库和表的基本操作
CREATE DATABASE testdb CHARSET=UTF8 创建一个数据库 名字叫做testdb USE testdb; 选择数据库 CREATE TABLE testTable1( ) ...
- MQ消息丢了怎么破?在线等.....
MQ又丢消息了,老板眉头一紧............ 在我们从事技术的工作中,离不开中间件,mq就是常见的中间件之一,丢消息可能是我们经常遇到的,为啥会丢?丢了怎么破?测试能不能复现,很多同学知道一些 ...
- java基础进阶篇(四)_HashMap------【java源码栈】
目录 一.前言 二.特点和常见问题 二.接口定义 三.初始化构造函数 四.HashMap内部结构 五.HashMap的存储分析 六.HashMap的读取分析 七.常用方法 八.HashMap 的jav ...
- DotNet Core 使用 StackExchange.Redis 简单封装和实现分布式锁
前言 公司的项目以前一直使用 CSRedis 这个类库来操作 Redis,最近增加了一些新功能,会存储一些比较大的数据,内测的时候发现其中有两台服务器会莫名的报错 Unexpected respons ...
- SQL Server 最小日志记录
SQL Server之所以记录事务日志,首要目的是为了把失败或取消的操作还原到最原始的状态,但是,并不是所有的操作都需要完全记录事务日志,比如,在一个空表上放置排他锁,把大量的数据插入到该空表中.即使 ...
- SQLyog试用到期的解决方法(仅供个人学习使用,禁止转载或用于商业盈利)
作者:EzrealYi 本章链接:https://www.cnblogs.com/ezrealyi/p/12434105.html win+r->输入regedit->进入注册表 在计算机 ...
- JavaScript的函数(一)
,1,在javascript中,函数即对象.函数里面的参数可以是个函数,例如: data.sort(function(a,b){return a-b;}) 函数的返回值,return语句导致函数停止执 ...