抽象類別

      在〈抽象類別〉中尚無留言

一般的物件導向中,都把抽象類別定義為 : 子類別繼承者必需遵守的合約。也就是說子類別必需實作父類別的抽象方法。這句話好像有聽沒有懂,所以在此我們用另一種方法來說明。先看如下代碼

class Pokemon():
def setLevel(self, level):
self.level=level
class Pikachu(Pokemon):
pass
p1=Pokemon()
p2=Pikachu()

上面代碼中,如果產生一隻皮卡丘(Pikachu),這我們還能理解,因為皮卡丘就是長的像下面圖片的樣子

那麼,產生一隻神奇寶貝 p1=Pokemon() 呢?? 這隻神奇寶貝到底是長什麼樣子。Pokemon是所有神奇寶貝的統稱,所以 p1=Pokemon()毫無意義,也就是說,根本就不能產生 Pokemon物件。

抽象類別

那麼要如何禁止產生Pokemon呢?此時必需將Pokemon設為 metaclass=ABCMeta,然後再設定某一個方法為設定為抽像方法(@abstractmethod),抽象方法的內容必需使用 pass。

請注意,抽象類別可以實体方法與抽象方法一起混合。但一定要有一個或以上的抽象方法。如下代碼中,p1=Pokemon() 即會發生執行時期錯誤。

from abc import ABCMeta, abstractmethod
class Pokemon(metaclass=ABCMeta):
def __init__(self, level, speed):
self.level=level
self.setSpeed(speed)
@abstractmethod
def setSpeed(self, speed):
pass
p1=Pokemon()

實作抽象類別

子類別繼承抽象類別後,還必需實作抽象方法才可以產生物件。如果子類別繼承抽象類別後沒有實作抽象方法,那麼子類別還是屬於抽象類別。如下Pikachu類別因為實作了 setSpeed()方法,所以就屬於一般類別,可以產生物件。

from abc import ABCMeta, abstractmethod
class Pokemon(metaclass=ABCMeta):
def __init__(self, level, speed):
self.level=level
self.setSpeed(speed)
@abstractmethod
def setSpeed(self, speed):
pass
class Pikachu(Pokemon):
def setSpeed(self, speed):
self.speed=speed
p1=Pikachu(1, 100)
print(p1.level, p1.speed)

子類別實作抽象方法這個動作,就是子類別必需遵守抽象類別所定下的合約

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *