python類的繼承與多型

2021-07-08 17:52:25 字數 1939 閱讀 5951

定義乙個類

class

animal

(object):

defrun

(self):

print

'animal is runnning'

繼承此類

class

dog(animal):

pass

例項化

dog.run()

**animal is runnning**

以上:母類擁有乙個方法

此方法會繼承到子類,故子類也可以執行此方法(run())

如果給子類賦予方法

class

dog(animal):

defrun

(self):

print

'dog is runnning'

dog = dog()

dog.run()

**dog is runnning**

子類的run()覆蓋了父類的run(),在**執行的時候,總是會呼叫子類的run()。這樣,我們就獲得了繼承的另乙個好處:多型

要理解多型的好處,我們還需要再編寫乙個函式,這個函式接受乙個animal型別的變數:

def

run_twice

(animal):

animal.run()

animal.run()

當我們傳入animal的例項時,run_twice()就列印出:

run_twice(animal())

animal is running…

animal is running…

當我們傳入dog的例項時,run_twice()就列印出:

run_twice(dog())

dog is running…

dog is running…

當我們傳入cat的例項時,run_twice()就列印出:

run_twice(cat())

cat is running…

cat is running…

看上去沒啥意思,但是仔細想想,現在,如果我們再定義乙個tortoise型別,也從animal派生:

class

tortoise

(animal):

defrun

(self):

print

'tortoise is running slowly...'

當我們呼叫run_twice()時,傳入tortoise的例項:

run_twice(tortoise())

tortoise is running slowly…

tortoise is running slowly…

你會發現,新增乙個animal的子類,不必對run_twice()做任何修改,實際上,任何依賴animal作為引數的函式或者方法都可以不加修改地正常執行,原因就在於多型。

多型的好處就是,當我們需要傳入dog、cat、tortoise……時,我們只需要接收animal型別就可以了,因為dog、cat、tortoise……都是animal型別,然後,按照animal型別進行操作即可。由於animal型別有run()方法,因此,傳入的任意型別,只要是animal類或者子類,就會自動呼叫實際型別的run()方法,這就是多型的意思:

對於乙個變數,我們只需要知道它是animal型別,無需確切地知道它的子型別,就可以放心地呼叫run()方法,而具體呼叫的run()方法是作用在animal、dog、cat還是tortoise物件上,由執行時該物件的確切型別決定,這就是多型真正的威力:呼叫方只管呼叫,不管細節,而當我們新增一種animal的子類時,只要確保run()方法編寫正確,不用管原來的**是如何呼叫的。這就是著名的「開閉」原則:

python類的繼承與多型

繼承 class 類名 父類名 子類繼承父類,執行初始化 init 時,子類屬性要把 父類名.init 方法 屬性 全部寫上 在給物件賦值 如果子類物件使用父類的方法屬性 1可以在子類方法中,寫上父類的方法及屬性 父類 init 方法 屬性 經典類寫法 2或者用super呼叫父類方法,super 或...

python 類的繼承與多型

類的繼承 class anmial object anmial 類繼承object def init self,self.def eat self print anmial is eating def run self print running class cat anmial cat類繼承anm...

python類封裝,繼承與多型

將類的函式偽裝成物件的屬性,使用該裝飾器裝飾的類的方法 可用物件名.方法名呼叫。此時不用加括號 此時的learn方法是用的類屬性的呼叫方式進行呼叫 類的繼承方式,在類名的括號中加入要繼承類的類名,當要繼承多個類時,用逗號隔開。利用類的內建屬性 bases 可以檢視當前類繼承了哪些類 在物件呼叫方法時...