當一個類別中有抽象方法(abstract method,即未有具體化內容的方法),即稱為抽象類別(abstract class)。一個抽象類別不能產生實體,除非繼承抽象類別的子類別(或更多層的子類別)完成了與抽象方法同名的方法,讓原本抽象的方法具體化,此時才能產生其子類別的實體。
from abc import ABC, abstractmethod
#----------------------
# 父類別, 職員(抽象)
#----------------------
class Employee(ABC):
def __init__(self, no, name):
self.__no = no
self.__name = name
@property
def no(self):
return self.__no
@property
def name(self):
return self.__name
@no.setter
def no(self, no):
self.__no = no
@name.setter
def name(self, name):
self.__name = name
# 計算薪水的抽象方法
@abstractmethod
def salary(self):
return NotImplemented
#----------------------
# 子類別, 一般職員
#----------------------
class RegularEmployee(Employee):
def __init__(self, no, name, overtimes):
super().__init__(no, name)
self.__overtimes = overtimes
@property
def overtimes(self):
return self.__overtimes
@overtimes.setter
def overtimes(self, overtimes):
self.__overtimes = overtimes
#具體化計算薪水的方法
def salary(self):
return 50000 + self.overtimes*250
第1行使用abc套件(abstract base class)
第6行讓Employee繼承ABC,並在第28行用@abstractmethod宣告一個抽象方法,Employee就成為一個具有抽象方法的抽象類別。
第35行,RegularEmployee繼承了Employee,除非它完成父親的抽象方法,否則RegularEmployee也會是抽象方法。
第49~50行完成繼承到的抽象方法的內容,使RegularEmployee成為一個可以產生實體的方法。
e1 = RegularEmployee('1001', '王小明', 20)
print(e1.no)
print(e1.name)
print(e1.overtimes)
print(f'{e1.salary():,}元')
請以以上的例子為基礎,再增加1個「兼職職員」類別,名稱是「ParttimeEmployee」。「兼職職員」也繼承「職員」,它有1個建構元以設定「班別」及「兼職時數」;它也有一個salary()方法,用來計算薪水。計算的方法是「日班每小時215元,夜班每小時295元」。