1.單下划線
變量前的單下划線表示表面上私有 ,但是其實這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變量,不要隨意訪問”。
2.雙下划線
變量前的雙下划線表示真正的私有,實際上的私有,只有內部可以訪問,外部不能訪問
但是有竅門,可以在類里面增加get__namedede和set__namedede這樣的方法來突破限制,而且還能在方法里做驗證。
3.其他(如:init):
名稱前后的雙下划線是一種慣例,對Python系統來說,這將確保不會與用戶自定義的名稱沖突。通常,你將會覆寫這些方法,並在里面實現你所需要的功能,以便Python調用它們。例如,當定義一個類時,你經常會覆寫“init”方法
總結:
前面單下划線 | _var | 變量所在模塊/類以外的地方也能訪問該變量,但最好不要 |
前面雙下划線 | __privateVar | 變量所在模塊/類以外的地方不能訪問該變量,這是私有變量 |
前后雙下划線 | 如__name__和__init__ | Python內置特殊變量,哪兒都可以訪問 |
示例:
class MyName:
_name = "WinerChan111" # 偽私有變量
__namedede = "WinerChan222" # 真正私有變量,但是增加get__namedede和set__namedede實例方法可訪問
def get_namedede(self):
return self.__namedede
def set_namedede(self,s):
self.__namedede = s
print(MyName._name)
print(MyName.__namedede)
#############輸出#######################
>>>
>>> class MyName:
... _name = "w1"
... __namedede = "w2"
...
>>> print(MyName._name)
w1
>>> print(MyName.__namedede)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'MyName' has no attribute '__namedede'
>>>
class MyName:
_name = "WinerChan111" # 偽私有變量
__namedede = "WinerChan222" # 真正私有變量,但是增加get__namedede和set__namedede實例方法可訪問
def get_namedede(self):
return self.__namedede
def set_namedede(self,s):
self.__namedede = s
print(MyName._name) print(MyName.__namedede)
###########輸出########### >>> >>> >>> print(MyName._name) w1 >>> r = MyName() >>> print(r.get_namedede()) w2 >>> name = "w3" >>> r.set_namedede(name) >>> r.get_namedede() 'w3' >>> >>>