訪問限制:
私有屬性前加__(雙下劃線),這樣實例化一個對象之后,該對象無法獲取、修改該屬性。
看個例子:
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
改完后,對于外部代碼來說,沒什么變動,但是已經(jīng)無法從外部訪問實例變量.__name和實例變量.__score了:
>>> bart = Student('Bart Simpson', 98)
>>> bart.__name
Traceback (most recent call last):
File "", line 1, in AttributeError: 'Student' object has no attribute '__name'
這樣就確保了外部代碼不能隨意修改對象內(nèi)部的狀態(tài),這樣通過訪問限制的保護,代碼更加健壯。
外部代碼要獲取name和score屬性,可以給類增加get_name和get_score方法,
外部代碼要獲取name和score屬性,可以給類增加set_name和set_score方法,
class Student(object):
...
def get_name(self):
return self.__name
def get_score(self):return self.__score
def set_score(self, score):
self.__score = score
注意:
1、需要注意的是,在Python中,變量名類似__xxx__的,也就是以雙下劃線開頭,并且以雙下劃線結(jié)尾的,是特殊變量,特殊變量是可以直接訪問的,不是private變量,所以,不能用__name__、__score__這樣的變量名。
2、有些時候,你會看到以一個下劃線開頭的實例變量名,比如_name,這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規(guī)定,當(dāng)你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變量,不要隨意訪問”。
3、雙下劃線開頭的實例變量是不是一定不能從外部訪問呢?其實也不是。不能直接訪問__name是因為Python解釋器對外把__name變量改成了_Student__name,所以,仍然可以通過_Student__name來訪問__name變量