python中的下划線


概述

python中的下划線主要分為如下幾類:

  • 前置單下划線,如_a,_variable,主要是用於將變量或方法定義為私有屬性。這里的私有屬性並非如java中的私有,而是一種約定俗成,想強行訪問仍舊可以正常訪問。

  • 后置單下划線,如a_,val_,主要用於將變量區別,如變量名稱和關鍵字沖突,后面加個下划線區別開來。

  • 前置雙下划線,如__val,類中帶前置雙下划線的變量或方法,都會觸發python解釋器的名稱修飾,是不能直接通過該名稱去訪問到的,實現了一定程度上的隔離。

  • 前后都有雙下划線,如__init__,這類方法是python中的魔法方法,可以去重載。

  • 單下划線本身如 _,主要用於無意義的變量名。

前置單下划線

將變量名,方法名指定為私有屬性,但在外部仍舊可以訪問到。這里只是一種約定俗成,對於私有方法或變量名,代表該對象/模塊的這類方法或者變量不想暴露出來,應盡量避免訪問私有屬性或方法。

舉例:

class A(object):
   def __init__(self):
       self._private=0
   def _private_method(self):
       print('AAAAA')      
>>>a=A()
>>>a._private
0
>>>a._private_method()#均能直接訪問
AAAAA

后置下划線

主要用於區分變量名

def_=3
int_=5

前置雙下划線

用雙下划線修飾屬性或者方法,會出發名稱修飾,即在外部訪問時,該方法名或變量名會變為 _類名__變量名;直接訪問__變量名是不存在的。

舉例:

class A(object):
   def __init__(self):
       self.__private=0
   def __private_method(self):
       print('AAAAA')
>>>a=A()
>>>a.__private
Traceback (most recent call last):
 File "<input>", line 1, in <module>
AttributeError: 'A' object has no attribute '__private'
>>>a.__private_method()#
Traceback (most recent call last):
 File "<input>", line 1, in <module>
AttributeError: 'A' object has no attribute '__private_method'
   
>>>a._A__private
0
>>>a._A__private_method()
AAAAA

可以看到,這種情況下最好定義一個接口去直接訪問。因為內部名稱還是沒變的,名稱修飾主要是在實例化后調用屬性或者方法時作用了。

class A(object):
   def __init__(self):
       self.__private=0
   def __private_method(self):
       print('AAAAA')
   def get_p(self):
       return self.__private
>>>a=A()
>>>a.get_p()
0

包括上面的單下划線規約的私有屬性,也可以通過定義接口方法去訪問,這樣的好處是私有的方法或者屬性無法被篡改,可以很好的保護起來。這里可以和@property結合起來使用。

單下划線本身_

舉例:

>>>a=[_ for _ in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>>a,_,_,d=func(*args,**kwargs)
#這種情況是我們只想要返回的第一個和第四個參數,中間兩個對於當前模塊沒啥意義,就無需去定義一個變量名稱。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM