Python中单双下划线使用

xiaoxiao2021-02-28  111

转载自:http://blog.csdn.net/my2010sam/article/details/10949717

出处: http://blog.chinaunix.net/uid-1721137-id-266703.html 在Python编程中经常会遇到函数(function),方法(method)及属性(attribute)以下划线'_'作为前缀,这里做个总结。 主要存在四种情形 [python]  view plain  copy <span style="font-family:SimSun; font-size:18px">1. object # public         2. __object__ # special, python system use, user should not define like it         3. __object # private (name mangling during runtime)         4. _object # obey python coding convention, consider it as private   </span>   通过上面的描述,1和2两种情形比较容易理解,不多做解释,最迷惑人的就是3和4情形。 在解释3和4情形前,首先了解下python有关private的描述,python中不存在protected的概念,要么是public要么就是private,但是python中的private不像C++, Java那样,它并不是真正意义上的private,通过name mangling(名称改编,下面例子说明)机制就可以访问private了。 针对 3:   [python]  view plain  copy <span style="font-family:SimSun; font-size:18px">class Foo():          def __init__():              ...                    def public_method():              print 'This is public method'                def __fullprivate_method():              print 'This is double underscore leading method'                def _halfprivate_method():              print 'This is one underscore leading method'   </span>   然后我们实例化Foo的一个对象,看看结果就很清晰了: [python]  view plain  copy <span style="font-family:SimSun; font-size:18px">f = Foo()            f.public_method() # OK            f.__fullprivate_method() # Error occur            f._halfprivate_method() # OK   </span>   上文已经说明了,python中并没有真正意义的private,见以下方法便能够访问__fullprivate_method() [python]  view plain  copy <span style="font-family:SimSun; font-size:18px">f._Foo__fullprivate()_method() # OK</span>   [python]  view plain  copy <span style="font-size:18px">      </span>   [python]  view plain  copy <ol><li><span style="font-size:18px"><span style="font-family:SimSun"><span style="color:#0000ff">print</span> dir<span style="color:#0000cc">(</span>f<span style="color:#0000cc">)</span>   </span></span></li></ol>  

['_Foo__fullprivate_method','_halfprivate_method','public_method',...]

所谓的name mangling就是将__fullprivate_method替换成了_Foo__fullprivate_method,目的就是以防子类意外重写基类的方法或者属性。 允许通过类内部方法访问其他私有方法,如下: 针对4: 从上面的例子可以看出,f._halfprivate_method()可以直接访问,确实是。不过根据python的约定,应该将其视作private,而不要在外部使用它们,(如果你非要使用也没辙),良好的编程习惯是不要在外部使用它咯。 同时,根据Python docs的说明,_object和__object的作用域限制在本模块内,见以下示例: [python]  view plain  copy <span style="font-family:SimSun; font-size:18px">'''''    A.py    '''      def _nok(): # __nok() same as _nok()         ...      def ok():          ...   </span>   [python]  view plain  copy '''''    <span style="font-family:SimSun; font-size:18px">B.py    '''      from A import *         ok() # work well         _nok() # error occur         __nok() # error occur   </span>                                 通过上面的例子就能很好地把握有关下划线的细节了,平时还是需要多动手练练。

转载请注明原文地址: https://www.6miu.com/read-37544.html

最新回复(0)