訪問權限分爲私有和公開
公開的訪問權限就是類的內部和外部均可以訪問
私有的訪問權限就是隻有內部能夠訪問,外部不能訪問,若是要想訪問,則需經過類內定義的get和set方法獲取和修改屬性值
這樣就確保了外部代碼不能隨意修改對象內部的狀態,如在set方法里加入判斷邏輯,可確保set值符合規定,這樣經過訪問限制的保護,代碼更加健壯spa
建立包含私有屬性的類code
class Student(object): def __init__(self, name, score): #若是要讓內部屬性不被外部訪問,能夠把屬性的名稱前加上兩個下劃線__ #在Python中,實例的變量名若是以__開頭,就變成了一個私有變量(private),只有內部能夠訪問,外部不能訪問 self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score)) def get_name(self): return self.__name def get_score(self): return self.__score def set_score(self, score): if 0 <= score <= 100: self.__score = score else: raise ValueError('bad score') bart = Student('Bart Simpson', 59) print(bart.__name) #報錯,由於__name是私有的,外部不能直接訪問 print(bart.get_name()) #輸出:Bart Simpson,經過自定義的get方法獲取name屬性 print(bart.get_score() ) #輸出:59,經過自定義的get方法獲取score屬性 bart.set_score(70) #經過set方法修改score屬性 print(bart.get_score()) #輸出:70 bart.__name = 'New Name'#該__name屬性與內部私有屬性__name不是同一個屬性,內部的__name其實是_Student__name,實際上該操做是爲實例綁定了一個新的屬性__name print(bart.__name) #輸出:New Name print(bart._Student__name) #輸出:Bart Simpson bart.get_name() #輸出:Bart Simpson,輸出的實際是內部私有屬性_Student__name變量的值
注意:
1) 屬性名格式爲__xxxx__的,表示特殊變量而不是私有變量,它是能夠被外部直接訪問的,因此私有屬性的格式必須是__xxxx
2) 屬性名格式爲_xxxx的,它是能夠被外部直接訪問的,但根據慣例,請將其視爲私有變量,不要隨意訪問
3) 屬性名格式爲__xxxx的,它雖然是內部私有屬性,但也並不是必定不能訪問,不能直接訪問是由於Python解釋器對外把__xxx變量改爲了_類名__xxxx(如_Student__name)
因此可經過_類名__xxxx來訪問內部私有屬性__xxxx,但強烈建議這樣作,由於不一樣版本的Python解釋器可能會把__xxx改爲不一樣的變量名
總的來講就是,Python自己沒有任何機制阻止你幹壞事,一切全靠自覺
4) 外部訪問__xxxx,如:實例名.__xxxx = '....',實際上訪問的不是內部私有屬性__xxxx(內部私有屬性實際上是:_類名__xxxx),而是綁定了一個新的公開屬性__xxxx對象