python 面向对象教程:访问限制
在Class內部,可以有屬性和方法,而外部代碼可以通過直接調用實例變量的方法來操作數(shù)據(jù),這樣,就隱藏了內部的復雜邏輯。
如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線__,在Python中,實例的變量名如果以__開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問。
class Student(object):def __init__(self, name, score):self.__name = nameself.__score = scoredef print_score(self):print('%s: %s' % (self.__name, self.__score)) bar = Student("Mike",90) print(bar.__name)輸出:
Traceback (most recent call last):File "E:/ru/231n/exer.py", line 11, in <module>print(bar.__name) AttributeError: 'Student' object has no attribute '__name'這樣就確保了外部代碼不能隨意修改對象內部的狀態(tài),這樣通過訪問限制的保護,代碼更加健壯。
如果外部代碼要獲取name和score,可以給Student類增加get_name和get_score這樣的方法:
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def get_name(self):return self.__namedef get_score(self):return self.__score如果又要允許外部代碼修改score,可以再給Student類增加set_score方法:
def set_score(self, score):self.__score = score雙下劃線開頭的實例變量也不是一定不能從外部訪問不能直接訪問__name是因為Python解釋器對外把__name變量改成了_Student__name,所以,仍然可以通過_Student__name來訪問__name變量:
print(bar._Student__name) #Mike需要注意的是,在Python中,變量名類似__xxx__的,也就是以雙下劃線開頭,并且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是private變量。
以一個下劃線開頭的實例變量名,比如_name,這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規(guī)定,當你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變量,不要隨意訪問”。
注意避免下面的錯誤:
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' bar.__name = "Tom" print(bar.__name) #Tom print(bar.get_name()) #Mike表面上看,外部代碼“成功”地設置了__name變量,但實際上這個__name變量和class內部的__name變量不是一個變量!內部的__name變量已經(jīng)被Python解釋器自動改成了_Student__name,而外部代碼給bart新增了一個__name變量。
總結
以上是生活随笔為你收集整理的python 面向对象教程:访问限制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python正则表达式 re.sub()
- 下一篇: python 函数教程:必选参数与默认参