python中关于下划线的整理

来源:互联网 发布:金蝶软件客服中心 编辑:程序博客网 时间:2024/05/16 11:05

最近在学习python,发现python的变量命名很有意思,尤其是加入下划线之后,作为一个准程序员,良好的代码规法一定要有,所以花时间找了一些资料,整理了一下。


首先,直接上结论:

Python 用下划线作为变量前缀和后缀指定特殊变量

_xxx 不能用’from module import *’导入
_xxx_ 系统定义名字
__xxx 类中的私有变量名

所以Python的核心风格有一条:避免用下划线作为变量名的开始。

一、具体说明:

  因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。  “单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;  “双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。   以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;   正如Python文档中所述:以下划线“_”为前缀的名称(如_spam)应该被视为API中非公开的部分(不管是函数、方法还是数据成员)。此时,应该将它们看作是一种实现细节,在修改它们时无需对外部通知。  以双下划线(__)开头的用法并不是一种惯例,对解释器来说它有特定的意义。Python中的这种用法是为了避免与子类定义的名称冲突。  Python文档指出:“__spam”这种形式(至少两个前导下划线,最多一个后续下划线)的任何标识符将会被“_classname__spam”这种形式原文取代,在这里“classname”是去掉前导下划线的当前类名。   以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。   这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。

二、应用示例

  1. 丢弃不必要的变量名
for i in range(6):        #do something

这里的变量 i 并没有实际意义,所以可以用下划线_来代替。

当你遇到一个不得不定义却又没有实际意义的变量时,都应该用下划线”-“来代替,用于提高代码的可维护性。

2.使一个变量变成私有变量
这里的下划线“-”和Java里的private有一样的功能,如果一个变量或函数以__(两个下画线“-”)开头,则表示这个变量或函数只能在此类或此模块中被访问

3.保护父类中的方法不会被重写

class A():      def __say_hello(self):          print "hello from A"  class B(A):      def __say_hello(self):          print "hello from B"  a = A()  b = B()  print dir(a), dir(b)  print b._A__say_hello(), b._B__say_hello()  /Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/xxx/PycharmProjects/untitled/b.py  ['_A__say_hello', '__doc__', '__module__'] ['_A__say_hello', '_B__say_hello', '__doc__', '__module__']  hello from A  None hello from B  None  Process finished with exit code 0 

从上面的例子中可以看出子类B没有重写父类A中的_say_hello()方法是因为类中以‘两个下划线–’开头的方法会被Python自动替换为[class_name][method_name]的形式,在外部不能用方法名直接调用这些方法,相当于类中的私有方法。

三、一些python系统保留定义的方法和属性

1、 python的内部保留属性:

这里写图片描述

2、 python的保留方法:
见文章:Python的保留方法


参考文章:
文章一: http://cdn.verydemo.com/demo_c122_i21159.html
文章二: http://blog.sina.com.cn/s/blog_64d0b03c0101gg0c.html

0 0