python以下划線開頭的變量和函數的作用


在python中,我們經常能看到很多變量名以_下划線開頭,而且下划線的數量還不一樣,那么這些變量的作用到底是什么?

變量名分類:

# 以數字、字母開頭: 正常的公有變量名
a = 1
def aa():
pass
# 以單下划線開頭: 半私有的變量名
_b = 2
def _bb():
pass
# 以雙下划線開頭: 私有變量名
__c = 3
def __cc():
pass
# 以雙下划線開頭,雙下划線結尾: 內置屬性名或者魔法方法名

__name__, __dir__

公有變量名:

以此類名稱命名的對象,為公有對象,任何人都可以使用

半私有變量名:

以此類名稱命名的對象,需要分為兩種情況

1.類外

類外的半私有對象、私有對象,功能一致,均是在本模塊中可以正常使用,但是不能被直接導入並調用

如果一定要在模塊外使用,那么需要導入本模塊,然后使用(模塊名.變量名)進行調用

2.類中

類中的半私有對象,僅僅是概念上的私有,默認不要再類外進行調用

實際在類外,均可以使用(實例名.變量名/類名.變量名)進行調用

私有變量名:

 以此類名稱命名的對象,也需要分為兩種情況

1.類外

此種情況下的對象,和半私有對象一樣,可參照上面

2.類中

類中的私有對象,在類外均不能直接調用,可以理解為真私有

但是,python中沒有完全私有的對象,此種對象也是可以在類外進行調用的,這里涉及到一個概念:矯直

 

class A:

def get_1(self):
return 1

def _get_2(self):
return 2

def __get_3(self):
return 3

print(dir(A))

結果為:
['_A__get_3', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_get_2', 'get_1']

從打印結果中我們看到,類A並不存在__get_3這么一個屬性,但是存在一個_A__get_3的屬性,這就是矯直

python對於出現在類中的私有屬性或者私有方法,進行矯直,矯直方法就是在私有屬性名、私有方法名前添加(_類名)

那么,我們想要調用類的私有屬性和方法的時候,就可以直接用矯直后的屬性名進行調用

魔法方法:

 這是python自己實現的屬性和方法,一般不允許自定義類似此種命名方式的屬性或者方法

關於這些方法和屬性的作用,大家可以自己試一試

 

 

原文:https://blog.csdn.net/baidu_28289725/article/details/81870462

 


免責聲明!

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



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