zoukankan      html  css  js  c++  java
  • 【Python】Python中的下划线

    单下划线(如: _var):

    使用单下划线,用于指定该名变量或函数属性为“私有”。这仅仅是一个惯例,不是强制规定。用于向其他程序员表明这个变量或函数仅仅供内部使用,外部不要访问它。但实际上外部还是可以访问。

    在类中,单下划线开始的成员变量是保护变量,意思是只有类对象和子类对象才能访问;“双下划线”开始的私有成员,意思是只有类对象自己能访问,连子类对象也不能访问。

     一个例外是,假设在当前模块module1中使用单下划线声明了一个变量_var。在其他模块中,使用import module1 或者 from module1 import *并不会导入_var的名称。使用from module1 import _var才生效。(Python 2.7.10)

    名称前双下划线(如: __var)

    名称(具体为一个方法名)前双下划线(__)的用法并不是一种惯例,对解释器来说它有特定的意义。Python中的这种用法是为了避免与子类定义的 名称冲突。Python文档指出,“__spam”这种形式(至少两个前导下划线,最多一个后续下划线)的任何标识符将会被 “_classname__spam”这种形式原文取代,在这里“classname”是去掉前导下划线的当前类名。例如下面的例子:

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

    正如所预料的,“_internal_use”并未改变,而“__method_name”却被变成了“_ClassName__method_name”。此时,如果你创建A的一个子类B,那么你将不能轻易地覆写A中的方法“__method_name”。

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

    这里的功能几乎和Java中的final方法和C++类中标准方法(非虚方法)一样。

     同样地,假设在当前模块module1中使用单下划线声明了一个变量__var。在其他模块中,使用import module1 或者 from module1 import *并不会导入__var的名称。使用from module1 import __var才生效。(Python 2.7.10)

    名称前后的双下划线(如:__init__)

    这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写 这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。

    虽然你也可以编写自己的特殊方法名,但不要这样做。

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

    其实,很容易摆脱这种类型的命名,而只让Python内部定义的特殊名称遵循这种约定。

    参考文献:

      1. http://www.zhihu.com/question/19754941

      2. http://python.jobbole.com/81129/

      3. http://www.chengxuyuans.com/Python/67370.html

  • 相关阅读:
    source insight 4.0.086破解
    Java IO流关闭问题的深入研究
    iOS开发UI篇—UITableview控件使用小结
    iOS开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
    iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
    iOS开发UI篇—实现UItableview控件数据刷新
    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序
    iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
    iOS开发UI篇—UITableviewcell的性能优化和缓存机制
    iOS开发UI篇—UITableview控件基本使用
  • 原文地址:https://www.cnblogs.com/vincently/p/4597625.html
Copyright © 2011-2022 走看看