python中一切皆是物件,變數、函式名、型別,...,顯然這使得物件導向程式設計變得更容易也更直觀。
類(class)是物件導向程式設計的利器,儘管在python中,完全可以不使用類,使用簡單的結構如函式(function)即可以完成大量的工作,然而類無疑是python提供的最有力的程式設計**。
通過類的使用,使得繼承、多型、運算子過載得以實現。
例項物件與類物件
這裡說明一下,所謂的例項物件(instance)是指通過對類物件類似於函式般呼叫得到的物件,
例如:class cla: ...
a = cla()
cla為類物件,a為類物件生成的例項物件,乙個類可以生成多個例項物件。每個例項物件都有自己的名字空間。這裡不得不提self,python中屬性通過類定義中的語句附加到類物件上,通過self附加到具體物件上。類的屬性,只要類內部語句中出現了命名語句如def,=等等都形成類的屬性。也可以這樣理解:所有例項物件共享類物件中的函式**,但擁有自己的資料,如果沒有self,就不知道要把函式應用到哪個物件的資料上,因此引入self。
舉個例子:
class cla:
value = 42
def func(self):
self.num = 10
這裡value、func都是cla的屬性,其中value為所有例項物件所共享,相當於c++中的類static變數,而每乙個例項物件都有乙個私有的num。
繼承
物件導向程式設計的最大好處是可以進行**復用。你的程式中需要的一些功能可能以前已經有人全部或者實現過了,那麼,最簡單的便是拿來主義,使用已有的類庫。這時,已有的類庫或許不能完成你的全部功能,或者提供的一些功能不能滿足你的需求,你僅僅需要重寫這一部分**,提供新的介面和實現,而不必重新構建全部。這大大的縮短了開發的週期,而且已有的開源類庫往往已經經過了很多人的使用和修改,一般來說比你重寫要更健壯也更高效。
繼承可以完成以上的功能,子類繼承基類的介面和實現,並可以新增新的介面。繼承的應用形成了類的層次結構,基類在上層,子類在下層,實際上這就是一棵樹。類本身只是生成了新的型別物件,我們主要是在物件的屬性上進行操作,形如:object.attribute。對物件屬性的正確呼叫本質上是乙個自底向上、自左向右的,樹搜尋的過程,首次遇到的attribute的出現做為最終呼叫。自底向上體現在按照例項物件(instance)-->子類物件-->基類物件的順序進行搜尋,自左向右體現在多重繼承中,按照繼承參數列中先後出現的次序進行搜尋。在類層次中,由不同層次的類物件生成的例項,決定了樹搜尋的不同起點。正是這種機制,使得子類可以通過重新定義同名函式來過載基類中已有的函式,因為在類層次樹中搜尋某個名字時,自底向上一定先遇到子類中的名字。還要強調的是,與
c++不同,
python
中的過載不是通過對參數列的型別進行判斷來決定的,因為
python
中的變數不需要型別宣告,因此完全使這種搜尋策略決定的。
多型
在c++中,多型是通過繼承、虛函式等機制使得基類指標或引用能夠根據所指的具體型別來呼叫相對應的函式來實現的。在python中多型則完全依賴於物件。
如上面的函式,傳遞給函式不同的reader物件,函式就呼叫不同的read()函式。如果reader是類層次中的某個型別的具體例項,那麼它將在類層次樹中搜尋找到第乙個出現的read名字。從這個角度說,繼承也對多型起到了作用。
OOP 類的繼承
在ext中通過ext.extend 方法來實現類的繼承 首先需要定義乙個子類,並在構造方法中呼叫父類的構造方法 然後通過ext.extend 方法實現繼承關係,在方法體內可以定義任何的方法,如果該方法的名稱和引數都與父類方法中某方法一致,那麼該方法是重寫的方法。否則,是新方法。例子 命名空間 ext...
c 中物件導向oop中的類定義
類宣告 以資料成員的方式描述資料部分,以成員函式的方式 又被成為方法 來描述公有介面。類方法定義 如何實現類成員函式。ifndef pch h define pch h include include class students endif 以上是我寫的乙個學生資訊管理系統中學生類,通常類定義放在...
OOP 三 抽象類與介面
abstract修飾符定義的類或者方法。規則 public abstract class shape private string color public abstract double getzc public abstract string gettype public shape 抽象類本身...