面對物件程式設計
oop程式設計的發展已經從簡單控制流中按步的指令序列進入到更有組織的方式中
結構化的或過程性的程式設計可以讓我們把程式組成邏輯塊,以便重複或重用
物件導向程式設計增強了結構化程式設計,實現資料與動作的融合
資料層和邏輯層由乙個可用以建立這些物件的簡單抽象層來描述
常用術語
抽象/實現:抽象是指現實世界問題和實體的本質表現,行為和特徵建模,建立乙個相關的子集,可以用於描繪程式的結構,從而實現這種模型
封裝/介面:封裝描述了對資料/資訊進行隱藏的觀念,他對資料屬性提供介面和訪問函式;客戶端根本不需要知道在封裝之後,資料屬性是如何組織,這就需要在設計時,對資料提供相應的介面
常用術語續1
合成:合成擴充了對類的描述,使得多個不同的類合成乙個大的類,來解決現實問題
派生/繼承:派生描述了子類的建立,新類保留已存類型別中所有需要的資料和行為,但允許修改和其他的自定義操作,都不會修改原類的定義
多型:指出了物件如何通過他們共同的屬性和動作來操作及訪問,而不需要考慮他們的具體的類。
常用術語續2
泛化/特化:泛化表示所有子類與其父類及祖先類有一樣的特點;特化描述所有子類的自定義,也就是什麼屬性讓他與其祖先類不同
自省/反射:自省表示給予程式設計師某種能力來進行像「手工型別檢查」的工作,它也被稱為反射。這個性質展示了某物件是如何在執行期取得自身資訊的
類建立類
類是一種資料結構,我們可以用它來定義物件,物件把資料值和行為特性融合在一起
python使用class關鍵字來建立類
通常類的第乙個字母大寫
類的資料屬性
資料屬性僅僅是所定義的類的變數
這種屬性已是靜態變數,或者是靜態資料。它們表示這些資料是與他們所屬的類物件繫結的,不依賴與任何類例項
靜態成員通常僅用來跟蹤與類相關的值
>>> class c(object):
... foo = 100
...
>>> print c.foo
100>>> c.foo +=1
>>> print c.foo
101特殊的類屬性
屬性 描述
c.__name__ 類c的名字(字串)
c.__doc__ 類c的文件字串
c.__base__ 類c的所有父類構成的元素
c.__dict__ 類c的屬性
c.__module__ 類c的定義所在的模組
c.__class__ 例項c對應的類
例項建立例項
如果說類是一種資料結構定義型別,那麼例項則宣告了乙個這種型別的變數
類被例項化得到例項,該例項的型別就是這個被例項化的類
建立例項與呼叫函式類似,呼叫乙個類就建立了它的乙個例項
>>> class c(object):
... foo = 100
...
>>> c=c()
>>> print c
<__main__.c object at 0x7f8c5143d210>
>>> print c()
traceback (most recent call last):
file "", line 1, in
typeerror: 'c' object is not callable
>>> >>> class c(object):
file "", line 1
>>> class c(object):
^syntaxerror: invalid syntax
例項屬性
例項僅擁有資料屬性,資料屬性只是與某個類的例項相關聯的資料值,並且可以通過句點屬性標識法來訪問
設定例項的屬性可以在例項建立後任意時間進行,也可以在能夠訪問例項的**中進行
>>> class c(object):
... pass
...
>>> c=c()
>>> c.hi = 'hello'
>>> print c.hi
hello
特殊的例項屬性
屬性 描述
i.__class__ 例項化i的類
i.__dict__ i的屬性
>>> c=c()
>>> c.hi = 'hello'
>>> print c.hi
hello
>>> c.__dict__
>>> print c.__class__
>>>
類與例項屬性對比
類屬性僅是與類相關的資料值,類屬性和例項無關
靜態成員(類的資料屬性)不會因為例項而改變他們的值,除非例項中顯示改變它
類和例項都是名字空間,各不相同
>>> class c(object):
... version = 1.0
...
>>> c=c()
>>> c.version +=0.1
>>> print 'in c version=%s, in c version=%s'%(c.version, c.version)
in c version=1.1, in c version=1.1
>>> c.version +=0.1
>>> print 'in c version=%s, in c version=%s' %(c.version, c.version)
in c version=1.1, in c version=1.2
>>>
組合及派生
方法__init__方法
__init__()是例項建立後乙個被呼叫的方法
設定例項的屬性可以在例項建立後任意時間進行,但是通常情況下優先在__init__方法中實現
繫結方法
方法僅僅是類內部定義的函式,方法只有在其所屬的類裡擁有例項時,才能被呼叫
任何乙個方法定義中的第乙個引數都是變數self,它表示呼叫此方法的例項物件
非繫結方法
呼叫非繫結方法並不經常用到
需要呼叫乙個沒有例項的類中的方法的乙個主要場景是你在派生乙個子類,而且要覆蓋父類的方法
組合什麼是組合
類被定義後,目標就是要把它當成乙個模組來使用,並把這些對像嵌入到你的**中去
組合就是讓不同的類混合並加入到其他的類中來增加功能和**重用性
可以在乙個大點的類中建立其他類的例項,實現一些其他屬性和方法來增強對原來的類物件
實現組合
建立復合物件、應用組合可以實現附加的功能
例如,通過組合實現上述位址簿功能的增強
子類和派生
建立子類
當類之間有顯著的不同,並且較小的類是較大的類所需要的元件時組合表現的很好,但當設計『相同的類但有些不同的功能時』,派生就是乙個更加合理的選擇
oop的強大方面之一是能夠使用乙個已經定義好的類,擴充套件它或對其進行修改,而不影響系統中使用視訊記憶體類的其他**片段
ood(物件導向設計)允許類特徵在子孫類或子類中進行繼承
建立子類續1
建立子類只需要在圓括號中寫明從哪個父類繼承即可
繼承繼承描述了基類的屬性如何遺傳給派生類
子類可以繼承它的基類的任何屬性,不管是資料屬性還是方法
通過繼承覆蓋的方法
如果子類中有和父類同名的方法,父類方法將被覆蓋
如需要訪問父類方法,則要呼叫乙個為繫結的父類方法,明確給出子類的例項
多重繼承
python允許多重繼承,即乙個類可以是多個父類的子類,子類可以擁有所有父類的屬性
類和例項的內建函式
函式 功能
rissubclass() 判斷乙個類是另乙個類的子類或孫類
isinstance() 在判定乙個物件是否是另乙個給定類的例項
hasattr() 判斷乙個物件是否有乙個特定的屬性
getattr() 獲得乙個物件的屬性值
setattr() 設定乙個物件的屬性
delattr() 刪除乙個物件的屬性
私有化python為類元素(屬性,方法)的私有性提供初步的形式,由雙下劃線開始的屬性在執行時被『混淆』,所以直接訪問是不允許的
c 物件導向程式設計 物件導向
什麼是物件導向 是對現實世界理解和抽象的方法。物件導向程式設計的特點 易維護,易擴充套件,靈活性好,重用 類 對事物的抽象定義,即事物具有的共同特徵和行為。物件 即對類進行例項 類是抽象的,物件是具體的 類的定義 語法 訪問修飾符 class 類名類的成員 包括字段,屬性,方法,常量,事件和索引器等...
物件導向程式設計
物件導向程式設計 抽象 封裝 繼承 多型 單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因。開放封閉原則 軟體實體應該可以擴充套件,但是不可修改。所有的設計模式都是對不同的可變性進行封裝,從而使系統在不同的角度上達到開發封閉原則。依賴倒轉原則 a 高層不應該依賴低層,兩個都應該依賴抽象。b ...
物件導向程式設計
class team def init self self.name tampa bay buccaneers bucs team print bucs.name tampa bay buccaneers 當呼叫team 函式時,會自動呼叫init函式,self是自動傳入到init中的引數,它指向當...