我們先來看前置雙下劃線:
以前置雙下劃線定義的屬性和方法,例項物件和子類無法呼叫和訪問。
首先看看例項物件對於私有方法的訪問許可權:
class
grandfather()
:def
__init__
(self)
: self.name =
"grandpa"
self.age =
80# 私有屬性
self.__money =
1000
# 私有方法
def__introduce
(self)
:print
("my name is %s and age is %s"
%(self.name, self.age)
)return
# 通過例項方法呼叫私有化方法
defintroduce
(self)
: self.__introduce(
)return
g = grandfather(
)# 例項物件無法呼叫私有方法
g.__introduce(
)# 'grandfather' object has no attribute '__introduce'
# 例項物件可以通過例項方法來呼叫私有化方法
g.introduce(
)# my name is grandpa and age is 80
print
(g.name)
# grandpa
print
(g.age)
# 80
# 例項物件無法訪問私有屬性
print
(g.__money)
# 'grandfather' object has no attribute '__money'
因此我們得知,例項物件無法呼叫私有方法和訪問私有屬性。
那麼接著看看子類對私有方法的許可權:
# 定義子類繼承grandfa
class
father
(grandfather)
:pass
f = father(
)# 子類可以呼叫父類的普通例項方法
f.introduce(
)# my name is grandpa and age is 80
# 子類無法呼叫父類的私有方法
f.__introduce(
)# 'father' object has no attribute '__introduce'
print
(f.name)
# grandpa
print
(f.age)
# 80
# 子類無法訪問父類的私有屬性
print
(f.__money)
# 'father' object has no attribute '__money'
因此我們同樣可以知道,子類無法呼叫父類的私有方法和訪問父類的私有屬性。但是可以通過父類的例項方法來訪問父類的私有屬性和呼叫父類的私有方法。
那麼私有屬性的意義何在?
安全性,有時候我們建立乙個類,這個類中我們定義了很多的屬性和方法。而且這個類需要被別人匯入進行使用,那麼就可能有需要類中的一些屬性和方法我們要求他是寫死的,僅僅允許別人使用但是不允許他人篡改。因此就需要將這些屬性和方法定義成為私有屬性。這樣,當別人呼叫你所編寫的這個類的時候,如果想要使用私有屬性或呼叫私有方法,就只能通過你所定義的普通方法對私有方法進行間接呼叫,這樣就實現了使用者只能呼叫你的私有方法,但是不能進行重寫和更改。
就像上面的例子,我們僅僅希望使用者得到grandfather
的一些簡介,但是不允許使用者更改他的簡介格式("my name is %s and age is %s"
)和他的money
。因此使用者所擁有的許可權僅僅是更改grandfather
的姓名和年齡。而money
僅僅是能夠做到通過間接手段進行訪問而無法更改他的值。
但前置下劃線:
單前置下劃線在類中所定義的屬性和方法,可以被例項物件和子類呼叫、更改、重寫。因此看上去和普通的屬性和方法沒什麼區別。
但是如果用但前置下劃線去定義乙個類,或者定義乙個普通函式的時候,那麼當別的py檔案通過from somemodule import *
匯入此檔案的時候,以但前置下劃線開頭的類和方法是不會被匯入的。
class
_person()
:def
intro
(self)
:print
("hello"
)def
_intro()
:print
("hello..."
)def
test()
:print
("test"
)if __name__ ==
'__main__'
: p = _person(
) p.intro(
)# hello
_intro(
)# hello...
test(
)# test
接著建立另乙個檔案進行匯入使用
# 上乙個檔案的名稱為 「類」
from 類 import
*p = _person(
)# name '_person' is not defined
_intro(
)# name '_intro' is not defined
test(
)# test
可以看到,僅僅test()
被匯入了。
那麼我們指定匯入的類和方法,則可以呼叫。
from 類 import _person, _intro, test
p = _person(
) _intro(
)# helo...
test(
)# test
因此,目前為之,單下劃線的作用好像就只是防止被import *
匯入。可能還有別的作用,但是我沒有了解到。
上面我們發現當對類中的乙個屬性或方法加上了前置雙下劃線則會變成私有屬性和方法,例項物件和字類就訪問不到了。這是為什麼呢?
我們可以看一下:
class
grandfather()
:def
__init__
(self)
: self.name =
"grandpa"
self.age =
80 self.__money =
1000
self._height =
20def
__introduce
(self)
:print
("my name is %s and age is %s"
%(self.name, self.age)
)return
defintroduce
(self)
: self.__introduce(
)return
print
(grandfather.__dict__)
結果:
這裡我們就發現,原來被__
定義的屬性和方法,python都給他們改名了。
'_grandfather__introduce'
, 再前面加上了_類名
。
那麼我們就用這個方式來訪問一下:
g = grandfather(
)g._grandfather__introduce(
)# my name is grandpa and age is 80
print
(g._grandfather__money)
# 1000
可以看到,私有屬性也被成功訪問了,而之前不能被訪問的原因就是人家改名字了。。。 python 私有屬性和視為私有屬性
python模組中的視為私有屬性 總的來說,python中有 幾種特殊的屬性 在python模組中,我們經常會見到 x 其中後面兩種 x 是習慣上的私有變數,我們不應該在外部使用它,而是應該通過呼叫內部函式來使用,但這裡是不應該而不是不能,所以要靠我們自覺遵守這個標準,另外,在自定義模組的時候,也要...
python中私有屬性和私有方法,修改私有屬性的值
self.money 1000000子類繼承了父類 如果父類的屬性私有 將不會被子類繼承 私有屬性和私有方法可以在類的裡面使用 自定義類中 如果乙個屬性進行了私有 在類的外面不能呼叫 物件名.屬性名 資料 直接修改 物件名.方法名 間接修改class person object def init s...
Python中屬性的私有化
1.引入 在python物件導向程式設計過程中,修改類屬性都是直接通過類名修改的,如果有些重要的屬性不希望他人任意修改怎麼辦呢?這就要用到屬性私有化功能。2.概念 保護屬性安全,使其不能隨意修改,將屬性定義為私有屬性,新增乙個可呼叫的方法去使用。3.語法 兩個下劃線開頭,宣告該屬性為私有,不能在類的...