單下划線開頭(_
)
- 在模塊中使用單下划線開頭
模塊中使用單下划線(_)開頭定義函數、全局變量和類不能被模塊外部以: from module import *
形式導入。
但可以用:from module import _func
形式單獨導入。
當然定義函數、全局變量和類前面有2個或者更多下划線開頭也不可以用 from module import *
的形式導入。
# 單下划線開頭的函數
def _my_abs(num):
return 'my_abs:' + str(abs(num))
# 單下划線開頭的全局變量
_My_var
# 單下划線開頭的類
_My_Class:
pass
- 在類中使用單下划線開頭
帶單下划線的類變量、實例變量和方法,允許類內部、類實例和子類訪問,不受限制。
單下划線僅僅是一種私有申明約定,訪問不受限制。
雙下划線開頭(__
)
- 在class類的內部,帶雙下划線的類變量、實例變量、方法具有正常訪問權限。
- 在繼承結構中,帶雙下划線的基類的類變量和實例變量不能被子類直接訪問。
- 在實例中,帶雙下划線的類變量、實例變量、方法不能被直接訪問。但有辦法間接訪問。
雙下划線開頭的類變量、實例變量、方法在繼承和實例中可以間接訪問
雙下划線開頭的變量和方法替換為`單下划線+類名+雙下划線開頭的變量和方法`的形式,且雙下划線開頭的變量和方法后面最多只能以一個單下划線結束,否則也無法訪問。
class BaseCls:
def __init__(self, name, age, nick_name):
self.name = name
self.__nick_name_ = nick_name # __nick_name后面最多以一個_結束,否則通過基類名混淆的方式也無法訪問了。
self.age = age
class SubCls(BaseCls):
def __init__(self, name, age, addr, nick_name):
super().__init__(name, age, nick_name)
self.addr = addr
self.a_nick_name = self._BaseCls__nick_name_