Python入門到精通三天速成第二講 類與繼承

2021-10-02 15:44:26 字數 1704 閱讀 7050

子類擴充套件了超類(父類)的定義。要指定超類,可在 class 語句中的類名後加上超類名,並將其用圓括號括起。

class filter:

def init(self):

self.blocked =

def filter(self, sequence):

return [x for x in sequence if x not in self.blocked]

class spamfilter(filter): # spamfilter是filter的子類

def init(self): # 重寫超類filter的方法init

self.blocked = ['spam']

filter 是乙個過濾序列的通用類。實際上,它不會過濾掉任何東西。

>>> f = filter()

>>> f.init()

>>> f.filter([1, 2, 3])

[1, 2, 3]

filter 類的用途在於可用作其他類(如將 'spam' 從序列中過濾掉的 spamfilter 類)的基類(超類)。

>>> s = spamfilter()

>>> s.init()

>>> s.filter(['spam', 'spam', 'spam', 'spam', 'eggs', 'bacon', 'spam'])

['eggs', 'bacon']

請注意 spamfilter 類的定義中有兩個要點。

 以提供新定義的方式重寫了 filter 類中方法 init 的定義。

 直接從 filter 類繼承了方法 filter 的定義,因此無需重新編寫其定義。

第二點說明了繼承很有用的原因:可以建立大量不同的過濾器類,它們都從 filter 類派生而來,並且都使用已編寫好的方法 filter 。這就是懶惰的好處。

要確定乙個類是否是另乙個類的子類,可使用內建方法 issubclass 。

>>> issubclass(spamfilter, filter)

true

>>> issubclass(filter, spamfilter)

false

>>> spamfilter.__bases__

(,)>>> filter.__bases__

(,)

同樣,要確定物件是否是特定類的例項,可使用 isinstance 。

>>> s = spamfilter()

>>> isinstance(s, spamfilter)

true

>>> isinstance(s, filter)

true

>>> isinstance(s, str)

false

如你所見, s 是 spamfilter 類的(直接)例項,但它也是 filter 類的間接例項,因為 spamfilter是 filter 的子類。換而言之,所有 spamfilter 物件都是 filter 物件。從前乙個示例可知, isinstance也可用於型別,如字串型別( str )。

如果你要獲悉物件屬於哪個類,可使用屬性 __class__ 。

>>> s.__class__

Python入門到精通三天速成第三講 多重繼承

前一講,你肯定注意到了乙個有點奇怪的細節 複數形式的 bases 前面說過,你可使用它來獲悉類的基類,而基類可能有多個。為說明如何繼承多個類,下面來建立幾個類。class calculator def calculate self,expression self.value eval express...

Python從入門到精通

大神請繞路而走,本文適合入門小白 python基礎 python 資料型別和變數 python 字串和編碼 python 使用list和tuple python 條件判斷和迴圈 python 使用dict和set 函式python 呼叫函式 python 定義函式 python 函式的引數 pyth...

flutter從入門到精通三

flutter可以通過一套 執行在多個平台上,包括移動,web,桌面,嵌入式,但是在 web 平台的支援尚未達到 beta 階段,請不要用在生產環節,在閱讀文件時候,推薦大家閱讀 這是和官方文件同步的中文 減少學習的成本 下面所有的 和案例都是基於編輯器vs code進行編輯,使用該編輯器和編輯器外...