訪問權限

訪問權限分爲私有和公開
公開的訪問權限就是類的內部和外部均可以訪問
私有的訪問權限就是隻有內部能夠訪問,外部不能訪問,若是要想訪問,則需經過類內定義的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對象

相關文章
相關標籤/搜索