Python 面向对象编程基础
??????????????????????????????????????????????????? Python面向對象編程
簡介:面向對象編程——Object?Oriented?Programming,簡稱?OOP,是一種程序設計思想。OOP?把對象作為程序的基本單元,一個對象包含了數據和操作數據的函數(方法)。
簡單例子:
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))
bart?=?Student('Bart?Simpson',?59)??#?實例化對象
lisa?=?Student('Lisa?Simpson',?87)
bart.print_score()??#?調用對象方法
????面向對象最重要的概念就是類(Class)和實例(Instance),必須牢記類是抽象的模板,比如?Student?類;而實例是根據類創建出來的一個個具體的“對象”,比如bart,?lisa;每個對象都擁有相同的方法,但各自的數據可能不同,?因為python是一門動態語言。和普通的函數相比,在類中定義的函數只有一點不同,就是第一個參數永遠是實例變量?self,并且,調用時,不用傳遞該參數。除此之外,類的方法和普通函數沒有什么區別,所以,你仍然可以用默認參數、可變參數、關鍵字參數和命名關鍵字參數。函數參數請參考這篇文章
????注意到__init__方法的第一個參數永遠是?self,表示創建的實例本身,因此,在__init__方法內部,就可以把各種屬性綁定到?self,因為?self就指向創建的實例本身。?有了__init__方法,在創建實例的時候,就不能傳入空的參數了,必須傳入與__init__方法匹配的參數,但?self?不需要傳,Python?解釋器自己會把實例變量傳進去。
?訪問限制:?
在?Class?內部,可以有屬性和方法,而外部代碼可以通過直接調用實例變量的方法來操作數據,這樣,就隱藏了內部的復雜邏輯。?但是,從前面?Student?類的定義來看,外部代碼還是可以自由地修改一個實例的?name、score?屬性:?
>>>?bart?=?Student('Bart?Simpson',?98)
>>>?bart.score?98
>>>?bart.score?=?59
>>>?bart.score?59?
如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線__,在?Python?中,實例的變量名如果以__開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問,所以,我們把?Student類改一改:?
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))?
改完后,對于外部代碼來說,沒什么變動,但是已經無法從外部訪問實例變量.__name?和實例變量.__score?了:?
>>>?bart?=?Student('Bart?Simpson',?98)?
>>>?bart.__name?Traceback?(most?recent?call?last):???File?"<stdin>",?line?1,?in?<module>?AttributeError:?'Student'?object?has?no?attribute?'__name'?
這樣就確保了外部代碼不能隨意修改對象內部的狀態,這樣通過訪問限制的保護,代碼更加健壯。但是如果外部代碼要獲取?name?和?score?怎么辦?可以給?Student?類增加get_name?和?get_score?這樣的方法:?
class?Student(object):
...
def?get_name(self):
return?self.__name?
? def?get_score(self):
return?self.__score?
如果又要允許外部代碼修改?score?怎么辦?可以再給?Student?類增加set_score?方法:?
class?Student(object):
?...?
def?set_score(self,?score):
self.__score?=?score?
你也許會問,原先那種直接通過?bart.score?=?59?也可以修改啊,為什么要定義一個方法大費周折?因為在方法中,可以對參數做檢查,避免傳入無效的參數:?
需要注意的是,在?Python?中,變量名類似__xxx__的,也就是以雙下劃線開頭,并且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是?private?變量,所以,不能用__name__、__score__這樣的變量名。?有些時候,你會看到以一個下劃線開頭的實例變量名,比如_name,這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規定,你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變量,不要隨意訪問”。?雙下劃線開頭的實例變量是不是一定不能從外部訪問呢?其實也不是。不能直接訪問__name?是因為?Python?解釋器對外把__name?變量改成了_Student__name,所以,仍然可以通過_Student__name?來訪問__name?變量:
?
>>>?bart._Student__name?
>>>'Bart?Simpson'?
但是強烈建議你不要這么干,因為不同版本的?Python?解釋器可能會把__name?改成不同的變量名。?
好,講到這里,我們停一下,切切記住:在python中,變量命名規則:
普通變量命名則如?count?,?my_count?;
特殊變量命名如?__author__?,?__name__?;
‘私有’變量命名如?_name?,?__name?;
總結
以上是生活随笔為你收集整理的Python 面向对象编程基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python函数参数学习
- 下一篇: DOS网络命令 之 ping