變量名的分類:
以數字字母開頭:正常的公有變量,如:a=1, def a()
以單下划線開頭:半私有,如:_b = 2, def _bb()
以雙下划線開頭:私有,如:__c = 3, def __cc()
以雙下划線開頭雙下划線結尾:內置屬性名或魔法方法名(系統定義的名字),如:__name__, __dir__
公有
任何人都可以使用
半私有
1. 類外
類外的半私有對象、私有對象,功能一致,均是在本模塊中可以正常使用,但是不能被直接導入並調用
如果一定要在模塊外使用,那么需要導入本模塊,然后使用(模塊名.變量名)進行調用
2. 類中
類中的半私有對象,僅僅是概念上的私有,默認不要在類外進行調用
實際在類外,均可以使用(實例名.變量名/類名.變量名)進行調用
私有
1. 類外
同半私有一樣
2. 類中
類中的私有對象,在類外均不能直接調用,可以理解為真私有
但是python沒有完全私有的對象,此種對象可以通過矯直在類外進行調用的(在私有屬性名、私有方法名前添加(_類名))
魔法方法
這是python自己實現的屬性和方法,一般不允許以這種方式自定義屬性或方法
半私有舉例:
在d2.py中調用d1.py中的半私有函數
d1.py
def _init(): global _global_dict _global_dict = {} def set_value(key, value): _global_dict[key] = value def get_value(key): return _global_dict[key]
d2.py
import d1 # 導入d1模塊 d1._init() # 使用模塊名.函數名進行調用 d1.set_value('name1', 'zhangsan') print(d1.get_value('name1'))
另,
d2.py(以下會報錯)
from d1 import * _init() # 會提示錯誤:Unresolved reference '_init'
d2.py(以下不報錯,這是為啥子呢?)
from d1 import _init _init() # 不報錯