Python中单/双下划线使用

本文详细解析了Python中私有成员的实现方式,包括不同下划线前缀的意义及其访问控制特性,帮助读者理解如何正确地使用这些特性来增强代码的封装性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

        1. 上文已经说明了,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
                


               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
              通过上面的例子就能很好地把握有关下划线的细节了,平时还是需要多动手练练。
              评论
              添加红包

              请填写红包祝福语或标题

              红包个数最小为10个

              红包金额最低5元

              当前余额3.43前往充值 >
              需支付:10.00
              成就一亿技术人!
              领取后你会自动成为博主和红包主的粉丝 规则
              hope_wisdom
              发出的红包
              实付
              使用余额支付
              点击重新获取
              扫码支付
              钱包余额 0

              抵扣说明:

              1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
              2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

              余额充值