python裡面的面向物件
一、什麼是面向物件(oop:object oriented programming)
面向過程:側重於怎麼做
1.把完成某一個需求的 所有步驟 從頭到尾 逐步實現 2.根據開發要求,將某些功能獨立的程式碼封裝成一個又一個函式 3.最後完成的程式碼,就是順序的呼叫不同的函式 特點: 1.注重步驟與過程,不注重職責分工 2.如果需求複雜,程式碼會變得很複雜 3.開發複雜專案,沒有固定的套路,開發難度很大
面向物件:誰來做 相比較函式,面向物件是更大的封裝,根據職責在一個物件中封裝多個方法 1.在完成某一個需求前,首先確定職責--要做的事(方法) 2.根據職責確定不同的物件,在物件內部封裝不同的方法(多個) 3.最後完成程式碼,就是順序的讓不同的物件呼叫不同的方法 特點: 1.注重物件和職責,不同的物件承擔不同的職責 2.更加適合對複雜的需求變化,是專門應對複雜專案的開發,提供的固定套路 3.需要在面向過程的基礎上,再學習一些面向物件的語法
二、熟悉面向物件程式設計(python iava c++)
類:是對一群具有相同特徵或行為的事物的一個統稱,不能直接使用(比如:飛機制造圖紙不能飛上天) 特徵:屬性 行為:方法物件:由類創建出來的一個具體的存在,可以直接使用。
物件的建立:物件變數 = 類名()
*在程式開發中:應該先有類 再有物件
類的設計 1.類名 這類事物的名字,滿足大駝峰命名法(每一個單詞的首字母大寫,單詞與單詞之間沒有下劃線) 2.屬性 這個類創建出的物件有什麼樣的特徵,如果不知道設定什麼初始值,可以設定為None,表示什麼都沒有,表示一個空物件,沒有方法和屬性,是一個特殊的屬性,可以將None賦值給任何一個變數。賦值格式:self.屬性名 = 屬性值 3.方法 這個類創建出的物件有什麼樣的行為類的建立
class 類名: def 方法1(self): pass def 方法2(self): passself意義 (1)哪一個物件呼叫的方法,self就是哪一個物件的引用 (2)在方法內部可以通過self訪問物件屬性類物件的生命週期 (1)在物件的生命週期內可以訪問物件的屬性和方法 (2)一個物件從呼叫類名建立,生命週期開始 (3)一個物件的__del__方法一旦被呼叫,宣告週期就結束私有屬性 (1)外界不能直接訪問 ,但是可以通過方法呼叫訪問 (2)定義:在屬性前面新增兩個下劃線,就是定義私有屬性 (3)物件不希望公開的屬性 私有方法(1)外界不能直接呼叫 (2)定義:在方法前面新增兩個下劃線,就是定義私有方法 (3)物件不希望公開的方法
三、面向物件的三大特點
1.封裝
- 將屬性和方法封裝到一個抽象的類中(為什麼說抽象,因為類不能直接使用)
- 外界使用類建立物件,然後讓物件呼叫方法(方法的細節都被封裝在類的內部)
例子:需求寫一個人類,小明愛跑步,體重75.0,每次跑步會減肥0.5公斤,每次吃東西會增加1公斤,小美的體重為45.0公斤。
class Person:
def __init__(self,name,weight):
# 初始化方法中增加兩個引數由外界傳遞
# self.屬性 = 形參
self.name = name
self.weight = weight
def __str__(self):
return '我的名字叫 %s 體重是 %.2f' %(self.name,self.weight)
def run(self):
print '%s 愛跑步' %self.name
# 在物件方法的內部,是可以直接訪問物件的屬性
self.weight -= 0.5
def eat(self):
print '%s 吃東西' %self.name
self.weight += 1
xx = Person('小明',75.0)
xx.run()
xx.eat()
print xx
# 同一個類創建出來的多個物件之間,屬性互補干擾
xm = Person('小美',45.0)
xm.run()
xm.eat()
print xm
2.繼承
(1)實現程式碼的重用,相同的程式碼不需要重複的寫 (2)子類擁有父類的所有屬性和方法,子類繼承於父類,可以享受父類已經封裝好的方法,子類應該根據自己的職責,封裝子類特有的屬性和方法 (3)定義方法 class 類名(父類): def 子類方法 (4)繼承擁有傳遞性,子類擁有父類的父類的屬性和方法,也就相當於孫子擁有爺爺的屬性和方法 (5)子類也叫派生類,父類也叫基類,繼承也就是派生
3.多型
(1)以封裝和繼承為前提,不同的子類物件呼叫相同的方法,產生不同的結果
四、父類方法
父類方法的重寫 (1)覆蓋父類的方法,如果子類中重寫了父類的方法,在執行中,只會呼叫在子類中重寫的方法,不會呼叫父類的方法 (2)若還需要顯示父類中被覆蓋的方法,就需要呼叫原本在父類中被覆蓋的方法:父類名.父類方法(self) (3)在子類中增加擴張覆蓋的父類方法 (4)!!!初始化方法也可能被覆蓋,所以需要在子類的初始化方法中呼叫父類的的初始化方法
繼承父類的私有屬性和私有方法 (1)在外界子類物件和父類物件不能直接訪問父類物件的私有屬性和私有方法 (2)在子類的物件方法中,不能訪問呼叫父類的私有屬性和方法 (3)若子類需要呼叫父類私有屬性和私有方法:在父類裡面定義一個公有方法,在父類的公有方法裡面呼叫父類私有屬性和私有方法,然後子類和父類的物件就可以通過呼叫父類的公有方法間接的呼叫父類的私有方法和私有屬性
多繼承 (1)可以讓子類物件同時具有多個父類的屬性和方法 (2)按照繼承順序繼承
五、新式類舊式類
1.object :是python為所有物件提供的基類,提供一些內建的屬性和方法,可以使用dir函式檢視 2.新式類:以object為基類的類,推薦使用 3.經典類:不以object為基類,不推薦使用 4.python3.x中預設使用object類,python2.X不指定的話,不會以object作為基類 5.格式:class A(object):