Python中的繼承和多態(tài)

這里我記錄的是Python中的繼承和多態(tài)


在OOP程序設計中,當我們定義一個class的時候,可以從某個現(xiàn)有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__='x54192'

class Animal(object):
    def run(self):
        print('Animal is running!')
        return 'Animal'

class Dogs(Animal):
    def run(self):
        print('there is dogs')
        #pass
        return 'dogs'
class Cats(Animal):
    def run(self):
        print('there is cats')
        #pass
        return 'cat'
class tortoise(Animal):
    def run(self):
        print('there is tortoise')
        #pass
        return 'tortoise'
#Python是動態(tài)語言,繼承是“鴨子類型”,它并不要求嚴格的繼承體系,一個對象只要“看起來像鴨子,走起路來像鴨子”,那它就可以被看做是鴨子。
#Python的“file-like object“就是一種鴨子類型。對真正的文件對象,它有一個read()方法,返回其內(nèi)容。但是,許多對象,只要有read()方法,都被視為“file-like object“。
#許多函數(shù)接收的參數(shù)就是“file-like object“,你不一定要傳入真正的文件對象,完全可以傳入任何實現(xiàn)了read()方法的對象。
class timer(object):
    def run(self):
        print('this is timer')
        return 'timer'

def run_twice(animal=timer()):
    animal.run()

print(run_twice())

從上面的代碼中發(fā)現(xiàn),新增一個Animal的子類,不必對run_twice()做任何修改,實際上,任何依賴Animal作為參數(shù)的函數(shù)或者方法都可以不加修改地正常運行,原因就在于多態(tài)。

多態(tài)的好處就是,當我們需要傳入Dog、Cat、Tortoise……時,我們只需要接收Animal類型就可以了,因為Dog、Cat、Tortoise……都是Animal類型,然后,按照Animal類型進行操作即可。由于Animal類型有run()方法,因此,傳入的任意類型,只要是Animal類或者子類,就會自動調(diào)用實際類型的run()方法,這就是多態(tài)的意思:

對于一個變量,我們只需要知道它是Animal類型,無需確切地知道它的子類型,就可以放心地調(diào)用run()方法,而具體調(diào)用的run()方法是作用在Animal、Dog、Cat還是Tortoise對象上,由運行時該對象的確切類型決定,這就是多態(tài)真正的威力:調(diào)用方只管調(diào)用,不管細節(jié),而當我們新增一種Animal的子類時,只要確保run()方法編寫正確,不用管原來的代碼是如何調(diào)用的。這就是著名的“開閉”原則:

對擴展開放:允許新增Animal子類;

對修改封閉:不需要修改依賴Animal類型的run_twice()等函數(shù)。

繼承還可以一級一級地繼承下來,就好比從爺爺?shù)桨职?、再到兒子這樣的關系。而任何類,最終都可以追溯到根類object。


圖片發(fā)自簡書App
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 在OOP程序設計中,當我們定義一個class的時候,可以從某個現(xiàn)有的class繼承,新的class稱為子類(Sub...
    chen_000閱讀 287評論 1 1
  • 程序在運行的過程中,根據(jù)傳遞的參數(shù)的不同,執(zhí)行不同的函數(shù)或者操作不同的代碼,這種在運行過程中才確定調(diào)用的方式成為運...
    云Shen不知處閱讀 441評論 0 0
  • 面向?qū)ο缶幊?面向?qū)ο缶幊獭狾bject Oriented Programming,簡稱OOP,是一種程序設計思...
    時間之友閱讀 853評論 0 0
  • date: 2016-10-09 18:45:18 這里繼承和多態(tài)的概念與java的概念差不多。概念還是需要多次理...
    樸有天虹閱讀 312評論 0 0
  • 繼承和多態(tài): 在OOP程序設計中,當我們定義一個class的時候,可以從某個現(xiàn)有的class繼承,新的class稱...
    黃大臻Dzreal閱讀 260評論 0 0

友情鏈接更多精彩內(nèi)容