zoukankan      html  css  js  c++  java
  • Python中单/双下划线使用 分类: python python基础学习 2013-09-02 21:31 1764人阅读 评论(0) 收藏

    在Python编程中经常会遇到函数(function),方法(method)及属性(attribute)以下划线'_'作为前缀,这里做个总结。
    主要存在四种情形
      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
      

      通过上面的描述,1和2两种情形比较容易理解,不多做解释,最迷惑人的就是3和4情形。
    在解释3和4情形前,首先了解下python有关private的描述,python中不存在protected的概念,要么是public要么就是private,但是python中的private不像C++, Java那样,它并不是真正意义上的private,通过name mangling(名称改编,下面例子说明)机制就可以访问private了。

    针对 3:
     
    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'
    

      然后我们实例化Foo的一个对象,看看结果就很清晰了:
      f = Foo()
      
      
      
      f.public_method() # OK
      
      
      
      f.__fullprivate_method() # Error occur
      
      
      
      f._halfprivate_method() # OK
      

      上文已经说明了,python中并没有真正意义的private,见以下方法便能够访问__fullprivate_method()
    1. f._Foo__fullprivate()_method() # OK
    2. 
      
      
      1. print dir(f)

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

    所谓的name mangling就是将__fullprivate_method替换成了_Foo__fullprivate_method,目的就是以防子类意外重写基类的方法或者属性。


    允许通过类内部方法访问其他私有方法,如下:



    针对4:
    从上面的例子可以看出,f._halfprivate_method()可以直接访问,确实是。不过根据python的约定,应该将其视作private,而不要在外部使用它们,(如果你非要使用也没辙),良好的编程习惯是不要在外部使用它咯。
    同时,根据Python docs的说明,_object和__object的作用域限制在本模块内,见以下示例:
    1. '''
      
      A.py
      
      '''
      
      def _nok(): # __nok() same as _nok()
      
         ...
      
      def ok():
      
          ...
      

    2. '''
      
      B.py
      
      '''
      
      from A import *
      
      
      ok() # work well
      
      
      _nok() # error occur
      
      
      __nok() # error occur
      


     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    通过上面的例子就能很好地把握有关下划线的细节了,平时还是需要多动手练练。
  • 相关阅读:
    HDU-2072-单词数(字典树)
    HDU-1251-统计难题(字典树)
    POJ-3630-Phone List(字典树)
    Acwing-204-表达整数的奇怪方式(扩展中国剩余定理)
    Acwing-203-同余方程(扩展欧几里得)
    Acwing-202-最幸运的数字(同余, 欧拉定理)
    Acwing-201-可见的点(数学, 欧拉函数)
    sql2014 新建用户并登陆
    sql修改约束语法练习
    java中static作用详解
  • 原文地址:https://www.cnblogs.com/think1988/p/4628079.html
Copyright © 2011-2022 走看看