python ——单下划线(约定)
命名规则:
通常使用小写单词,必要时用下划线分隔增加可读性.
使用一个前导下划线仅用于不打算作为类的公共接口的内部方法和实例变量. Python不强制要求这样; 它取决于程序员是否遵守这个约定. 使用两个前导下划线以表示类私有的名字. Python将这些名字和类名连接在一起:
如果类Foo有一个属性名为 __a, 它不能以Foo.__a访问. (执著的用户(An insistent user)还是可以通过Foo._Foo__a得到访问权.) 通常,双前导下划线应该只用来避免与类(为可以子类化所设计)中的属性发生名字冲突
我们都知道,Python没有“私有变量”这样的说法,如果想访问,始终是有办法,但使用双下划线“__”,可以很大程度上实现“私有”。这里无需多言。
那么单下划线“_“开始的特性呢?很多书里面都没有说清楚,这里我谈谈我的看法。如果不对,欢迎各位指正。
直接上简单代码:
Python中访问特性一般使用“访问器”(SetXXX,GetXXX这类的方法),但是为了看效果,这里使用“实例.变量”的方法访问。
>>> ap = A()
>>> ap.a
'a'
>>> ap._a
'_a'
>>> ap.__a
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: A instance has no attribute '__a'
也就是说,真正能起到“私有”作用的,还是“__”。这样使用双下划线,又被称为name-mangling。
那么,单下划线开头的特性到底有什么用呢?
If you don’t want the name-mangling effect, but you still want to send a signal for other
objects to stay away, you can use a single initial underscore.
----《Beginning Python From Novice to Professional》
因为我个人英文不好,我的理解是这样:如果你不想使用“__”,但是又想让其他对象远离它,那就使用“_”。
总结:
1.带有单下划线的特性不会被 from module import *导入。
2.单下划线是Python程序员使用类时的约定,表明程序员不希望类的用户直接访问属性。仅仅是一种约定!实际上,实例._变量,可以被访问。
3、__xxx___ 定义的是特列方法。像__init__之类的
才学Python没有多久,如果说的不好的,希望各位大神指正。
参考1:http://blog.donews.com/vaneoooo/archive/2006/02/28/746936.aspx
参考2:http://blog.163.com/jackylau_v/blog/static/175754040201182113817834/
ps:参考2个人觉得问题好多。其中以下我表示是不是有问题??
“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
“双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
-------------------------------------------------------2012.11.13晚割-------------------------------------------------------
在同学指点下,看了PEP 8
_single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.
又看了翻译的PEP 8:http://wiki.woodpecker.org.cn/moin/PythonCodingRule
方法名和实例变量
(Method Names and Instance Variables)
- 这段大体上和函数相同:通常使用小写单词,必要时用下划线分隔增加可读性. 使用一个前导下划线仅用于不打算作为类的公共接口的内部方法和实例变量. Python不强制要求这样; 它取决于程序员是否遵守这个约定. 使用两个前导下划线以表示类私有的名字. Python将这些名字和类名连接在一起:
如果类Foo有一个属性名为 __a, 它不能以Foo.__a访问. (执著的用户(An insistent user)还是可以通过Foo._Foo__a得到访问权.) 通常,双前导下划线应该只用来避免与类(为可以子类化所设计)中的属性发生名字冲突.
最新文章
- 深入理解jsonp跨域请求原理
- 2016-1-30 Servlet中Session管理(Sesssion追踪)
- 使用VS Code 从零开始开发并调试.NET Core 应用程序
- October 7th 2016 Week 41st Friday
- MUI - Dialog 提示窗
- 操作笔记:linux下安装ftp
- iOS-网络编程(二)文件上传和断点离线下载
- 模拟实现简化版List迭代器&;嵌入List
- c语言15行实现简易cat命令
- Struts(二十六):文件上传
- Grains 与 Pillars
- flutter 底部按钮切换页面
- php常用字符串方法
- jQuery 购物车
- 动态规划法(八)最大子数组问题(maximum subarray problem)
- 类加载, 静态变量初始化, String不可变, 泛型使用, 内部类
- linux 常用命令-用户、用户组管理
- vsphere storage appliance工作原理和实施
- Python3基础 file for+list 读取txt文本 并 一行一行的输出(低效率)
- nodejs async
热门文章
- Linux Mint---fcitx中文,日语输入法
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程
- AC日记——Little Elephant and Numbers codeforces 221b
- 我在16ASPX下了一个系统是ACCESS和VS2005做的我想把那个连接数据库的&#39;DB_16aspx&#39;的名字改了进不了了可是?
- laravel 安装碰到的问题:全局安装 Laravel Installer,然后用下面的指令创建新项目: laravel new blog报连接超时解决方案
- (1) C语言 基础1
- UVALive(LA) 3644 X-Plosives (并查集)
- 基于Bootstrap的表格插件bootstrap-table
- linux 自动删除n天前文件
- Java实现中文算数验证码(算数运算+-*/)