在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