1.   以一个下划线开头的命名 ,如_getFile
2.  以两个下划线开头的命名 ,如__filename
3.  以两个下划线开头和结尾的命名,如 __init__()
4.  其它

单下划线前缀的名称(例如_shahriar

以单下划线做前缀的名称指定了这个名称是“私有的”。在 有些 导入import * 的场景中,下一个使用你代码的人(或者你本人)会明白这个名称仅内部使用。Python documentation里面写道:

a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.

之所以说在在 有些 import * 的场景,是因为导入时解释器确实对单下划线开头的名称做了处理。如果你这么写from <module/package> import *,任何以单下划线开头的名称都不会被导入,除非模块/包的__all__列表明确包含了这些名称。更多相关信息见““Importing * in Python”

双下划线前缀的名称(例如__shahriar

以双下划线做前缀的名称(特别是方法名)并不是一种惯例;它对解释器有特定含义。Python会改写这些名称,以免与子类中定义的名称产生冲突。Python documentation中提到,任何__spam这种形式(至少以两个下划线做开头,绝大部分都还有一个下划线做结尾)的标识符,都会文本上被替换为_classname__spam,其中classname是当前类名,并带上一个下划线做前缀。
看下面这个例子:

  1. >>> class A(object):
  2. ... def _internal_use(self):
  3. ... pass
  4. ... def __method_name(self):
  5. ... pass
  6. ...
  7. >>> dir(A())
  8. ['_A__method_name', ..., '_internal_use']

正如所料,_internal_use没有变化,但__method_name被改写成了_ClassName__method_name。现在创建一个A的子类B(这可不是个好名字),就不会轻易的覆盖掉A中的__method_name了:

  1. >>> class B(A):
  2. ... def __method_name(self):
  3. ... pass
  4. ...
  5. >>> dir(B())
  6. ['_A__method_name', '_B__method_name', ..., '_internal_use']

这种特定的行为差不多等价于Java中的final方法和C++中的正常方法(非虚方法)。

前后都带有双下划线的名称(例如__init__

这些是Python的特殊方法名,这仅仅是一种惯例,一种确保Python系统中的名称不会跟用户自定义的名称发生冲突的方式。通常你可以覆写这些方法,在Python调用它们时,产生你想得到的行为。例如,当写一个类的时候经常会覆写__init__方法。
你也可以写出自己的“特殊方法”名(但是别这么做):

  1. >>> class C(object):
  2. ... def __mine__(self):
  3. ... pass
  4. ...
  5. >>> dir(C)
  6. ... [..., '__mine__', ...]

还是不要这样写方法名,只让Python定义的特殊方法名使用这种惯例吧。

  1. 关于python中带下划线的变量和函数 的意义
  2.  
  3. 总结:
  4. 变量:
  5. 1. 前带_的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量
  6. 2. 前带两个_ ,后带两个_ 的变量: 标明是内置变量,
  7. 3. 大写加下划线的变量: 标明是 不会发生改变的全局变量
  8. 函数:
  9. 1. 前带_的变量: 标明是一个私有函数, 只用于标明,
  10. 2. 前带两个_ ,后带两个_ 的函数: 标明是特殊函数
  11.  
  12. Python 的代码风格由 PEP 8 描述。这个文档描述了 Python 编程风格的方方面面。在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格。这样就易于阅读,易于在程序员之间交流。
  13.  
  14. 1 变量
  15.  
  16. 常量 : 大写加下划线
  17. USER_CONSTANT
  18. 对于不会发生改变的全局变量,使用大写加下划线。
  19.  
  20. 私有变量 : 小写和一个前导下划线
  21. _private_value
  22. Python 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线。但这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还是可以访问到这个变量。
  23.  
  24. 内置变量 : 小写,两个前导下划线和两个后置下划线
  25. __class__
  26. 两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户定义的变量要严格避免这种风格。以免导致混乱。
  27.  
  28. 2 函数和方法
  29.  
  30. 总体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,之后每个单词第一个字母大写,其余小写。但现在,小写和下划线已成为规范。
  31.  
  32. 私有方法 小写和一个前导下划线
  33. def _secrete(self):
  34. print "don't test me."
  35. 这里和私有变量一样,并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥作用)。特殊函数后面会提及。
  36.  
  37. 特殊方法 小写和两个前导下划线,两个后置下划线
  38.  
  39. def __add__(self, other):
  40. return int.__add__(other)
  41. 这种风格只应用于特殊函数,比如操作符重载等。
  42.  
  43. 函数参数 : 小写和下划线,缺省值等号两边无空格
  44.  
  45. def connect(self, user=None):
  46. self._user = user
  47.  
  48. 3
  49.  
  50. 类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该简明,精确,并足以从中理解类所完成的工作。常见的一个方法是使用表示其类型或者特性的后缀,例如:
  51. SQLEngine
  52. MimeTypes
  53.  
  54. 对于基类而言,可以使用一个 Base 或者 Abstract 前缀
  55. BaseCookie
  56. AbstractGroup
  57.  
  58. class UserProfile(object):
  59. def __init__(self, profile):
  60. return self._profile = profile
  61.  
  62. def profile(self):
  63. return self._profile
  64.  
  65. 4 模块和包
  66.  
  67. 除特殊模块 __init__ 之外,模块名称都使用不带下划线的小写字母。
  68. 若是它们实现一个协议,那么通常使用lib为后缀,例如:
  69. import smtplib
  70.  
  71. import os
  72. import sys
  73.  
  74. 5 关于参数
  75.  
  76. 5.1 不要用断言来实现静态类型检测
  77. 断言可以用于检查参数,但不应仅仅是进行静态类型检测。 Python 是动态类型语言,静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无意义的调用。
  78.  
  79. 5.2 不要滥用 *args **kwargs
  80. *args **kwargs 参数可能会破坏函数的健壮性。它们使签名变得模糊,而且代码常常开始在不应该的地方构建小的参数解析器。
  81.  
  82. 6 其他
  83.  
  84. 6.1 使用 has is 前缀命名布尔元素
  85.  
  86. is_connect = True
  87. has_member = False
  88.  
  89. 6.2 用复数形式命名序列
  90.  
  91. members = ['user_1', 'user_2']
  92.  
  93. 6.3 用显式名称命名字典
  94.  
  95. person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}
  96.  
  97. 6.4 避免通用名称
  98. 诸如 list, dict, sequence 或者 element 这样的名称应该避免。
  99.  
  100. 6.5 避免现有名称
  101. 诸如 os, sys 这种系统已经存在的名称应该避免。
  102.  
  103. 7 一些数字
  104. 一行列数 : PEP 8 规定为 79 列,这有些苛刻了。根据自己的情况,比如不要超过满屏时编辑器的显示列数。这样就可以在不动水平游标的情况下,方便的查看代码。
  105.  
  106. 一个函数 : 不要超过 30 行代码, 即可显示在一个屏幕类,可以不使用垂直游标即可看到整个函数。
  107. 一个类 : 不要超过 200 行代码,不要有超过 10 个方法。
  108. 一个模块 不要超过 500 行。
  109.  
  110. 8 验证脚本
  111.  
  112. 可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8
  113.  
  114. >>easy_install pep8
  115.  
  116. >>pep8 -r --ignoire E501 Test.py
  117.  
  118. 这个命令行的意思是,重复打出错误,并且忽略 501 错误(代码超过 79 行)。

Python 的类的下划线命名有什么不同?的更多相关文章

  1. Python的类的下划线命名的区别

    首先,单下划线开头,这个常被用于模块中,在一个模块中以单下划线开头的变量和函数被默认当做内部函数,如果使用from  module  import  *导入时,这部分变量和函数不会被导入.注意,如果使 ...

  2. python:类5——Python 的类的下划线命名有什么不同?

    首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入.不过值得注 ...

  3. 详解 Python 中的下划线命名规则

    在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...

  4. python 里面的单下划线与双下划线的区别

    python 里面的单下划线与双下划线的区别 Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __ ...

  5. python中那些双下划线开头得函数和变量--转载

    Python中下划线---完全解读     Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __x ...

  6. python python中那些双下划线开头的那些函数都是干啥用用的

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  7. python中那些双下划线开头得函数和变量

    Python中下划线---完全解读     Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __x ...

  8. json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: 原json串: String json= "{'user_name':'ok','user_sex':0,'object_info ...

  9. python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名

    python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名,如果在类中定义的就是类的私有成员. >>> dir(__builtin ...

随机推荐

  1. 用js解析XML文件,字符串一些心得

    解析XML文件遇到的问题 今天秦博士叫我解析一下XML文件,将里面的所有的X坐标Y坐标放在一个数组里面然后写在文档里让他进行算法比对,大家都知道了啦,解析XML文件获取里面的坐标数据什么的,当然是用前 ...

  2. 機器學習基石(Machine Learning Foundations) 机器学习基石 课后习题链接汇总

    大家好,我是Mac Jiang,非常高兴您能在百忙之中阅读我的博客!这个专题我主要讲的是Coursera-台湾大学-機器學習基石(Machine Learning Foundations)的课后习题解 ...

  3. Android设计模式(九)--外观模式

    问题:在Android中,Apk能够有微信,QQ为代表的插件式安装更新功能: 那么问题来了,主系统(姑且这么说)调用插件式安装的子系统.由子系统提供对外的訪问.属不属于一种外观模式呢? 先说设计模式: ...

  4. EBS採购模块中的级联接收和级联接收事务

    EBS採购模块中的级联接收和级联接收事务 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习.请注明出处:否则请与本人联系.违者必究) 级联接收和级联接收事务 级联功能对来自于同一个供应商 ...

  5. hdu 2209 bfs+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...

  6. [CSS]第一项和最后一项样式

    列表项的第一项距离顶部0.2rem,最后一项距离底部0.5rem .item:first-child { padding-top: .2rem; } .item:last-child { paddin ...

  7. 为什么还坚持.NET? 找一门适合自己的语言去做编程

    为什么还坚持.NET? 找一门适合自己的语言去做编程 接触了.NET快十二年了,现在专注于分布式服务的开发. 中间经历过各种编程语言的诱惑,ios等. 前几年才对自己有比较明确的定位 技术上:找到适合 ...

  8. Asp.Net Web API(三)

    Routing Tables路由表 在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action.当Web API接 ...

  9. 二叉树Binary_Tree(1):二叉树及其数组实现

    定义 二叉树: 二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递归定义是:二叉树要么为空,要么由根结点.左子树 ...

  10. Win10关闭某程序的通知的方法

    一.点击右下角的通知图标. 二.点击所有通知. 三.点击系统 四.点击通知和操作 五.下拉,看到:获取来自这些发送者的通知 六.关闭自己想关闭通知的程序即可.