本文目錄一覽:
Python中超類和子類有什麼區別
class a:
pass
class b(a):
pass
b類從a類繼承而來,a就是超類,b就是子類,b類可以使用a類定義的方法,也可以在a類的基礎上定義新的方法,a是基礎類,b是a的擴展
python抽象基類是什麼?用途是什麼?
有時候某些類型都有一些共同的特徵,它們可以被抽象出來形成一個基類,但這個基類本身不能實例化,只能由子類繼承並實現其中的抽象方法後實例化子類對象,這樣的類叫抽象類。
例如手機、電腦、電視機都可以歸類到電子設備,電子設備就是一個抽象類,它具有通電、運行、關閉等抽象方法,但你不可以直接new一個電子設備類的對象,因為沒法給它指定具體的形狀、功能等信息,只能從電子設備類派生出手機類、電腦類、電視類,並分別給出不同的通電、運行、關閉方法的具體實現,然後new這些類的對象。這就是多態的體現,C++/Java等靜態語言原生支持多態,擁有abstract關鍵字,可以用來定義抽象類。
而Python是一門鴨子類型的語言,它並不具有真正的多態,所以也沒有語言原生的抽象類支持,只能通過第三方的封裝類如ABC模擬實現。對於沒有接觸過C++和Java的Python學習者來說較難理解。
python下的抽象類的用途和意義?
抽象方法是基類中定義的方法,但卻沒有任何實現。在java中,可以把方法申明成一個接口。而在python中實現一個抽象方法的簡單的方法是:
class Sheep(object):
def get_size(self):
raise NotImplementedError
任何從Sheep繼承下來的子類必須實現get_size方法。否則就會產生一個錯誤。但這種實現方法有個缺點。定義的子類只有調用那個方法時才會拋錯。這裡有個簡單方法可以在類被實例化後觸發它。使用python提供的abc模塊。
import abc
class Sheep(object):
__metaclass__ = abc.ABCMeta
@abc.absractmethod
def get_size(self):
return
這裡實例化Sheep類或任意從其繼承的子類(未實現get_size)時候都會拋出異常。
因此,通過定義抽象類,可以定義子類的共同method(強制其實現)。
python中的super是什麼?-
目錄
python中的super,名為超類,可以簡單的理解為執行父類的__init__函數。由於在python中不論是一對一的繼承,還是一子類繼承多個父類,都會涉及到執行的先後順序的問題。那麼本文就着重看下super的具體作用。
通過設計這樣一個案例,我們可以明確super的前後邏輯關係:先定義一個父類 initial ,在這個父類中有參數值 param 和函數 func ,然後用子類 new 來繼承父類 initial 。繼承之後,在子類的 __init__ 函數中 super 執行的前後去打印參數值 param 和函數 func 的返回值,相關代碼如下所示:
代碼的執行結果如下所示:
首先我們注意到,父類 initial 中的 __init__ 函數內的打印語句,是在super之後才輸出的,這說明了, super 函數是在執行父類的初始化操作。那麼如果沒有執行 super , new 子類對 initial 父類的繼承體現在哪裡呢?答案就是父類的成員函數,比如這樣的一個案例:
其實就是刪掉了子類中重載的成員函數,那麼得到的結果如下:
可以發現在執行super之前就可以打印父類的 func 函數的函數值。所以python中繼承的邏輯是這樣的:
initial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.paraminitial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.param
也正是因為只有執行了 super 才能初始化父類中的成員變量,因此如果在super之前是無法訪問父類的成員變量的。
本文通過一個python的實際案例的設計,來講解python面向對象的技術——類的繼承中必用的super函數的邏輯。其實我們可以把python中類的繼承理解成這樣的一個過程:當我們在括號中明確了父類時,其實已經引用了父類的成員函數,但是並沒有執行父類的初始化函數。在執行子類的初始化函數的同時,會檢查是否重載了父類的成員函數,如果重載則會直接覆蓋。而只有在執行了super之後,才相當於執行了父類的初始化函數,此時才可以訪問父類的成員變量。
本文首發鏈接為:
作者ID:DechinPhy
更多原著文章請參考:
打賞專用鏈接:
騰訊雲專欄同步:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/280472.html