我們經常遇到不同的產品,它們有一個基本模型和一個高級模型,在基本模型的基礎上增加了一些功能。面向對象的軟件建模方法能夠擴展現有類的能力來構建新的類,而不是從頭開始構建。在 OOP 術語中,這種特性被稱為繼承,現有的類被稱為基類或父類,而新的類被稱為子類或子類。
當一個新的類與一個現有的類具有“是”的關系時,繼承就出現了。
狗是一種動物。貓也是一種動物。因此,動物是基類,而狗和貓是繼承類。
四邊形有四條邊。矩形是四邊形,正方形也是四邊形。四邊形是基類(也稱為父類),而矩形和正方形是繼承的類——也稱為子類。
子類從父類繼承數據定義和方法。這有助于重用已有的功能。子類可以添加一些定義或者重新定義一個基類方法。
這個特性在為系統中的對象構建類的層次結構時非常有用。也可以基于一個以上的現有類設計一個新類。這個特性叫做多重繼承。
建立繼承的一般機制如下所示:
Syntax:
class parent:
statements
class child(parent):
statements
定義子類時,父類的名稱放在它前面的括號中,表示兩者之間的關系。父類中定義的實例屬性和方法將被子類的對象繼承。
為了演示一個更有意義的例子,首先定義一個四邊形類,并將其用作矩形類的基類。
具有四條邊作為實例變量和周長()方法的四邊形類定義如下:
Example:
class quadriLateral:
def __init__(self, a, b, c, d):
self.side1=a
self.side2=b
self.side3=c
self.side4=d
def perimeter(self):
p=self.side1 + self.side2 + self.side3 + self.side4
print("perimeter=",p)
構造器(__init__()
方法)接收四個參數,并將它們分配給四個實例變量。要測試上述類,請聲明其對象并調用perimeter()
方法。
>>>q1=quadriLateral(7,5,6,4)
>>>q1.perimeter()
perimeter=22
我們現在基于quadriLateral
類設計一個矩形類(矩形是四邊形!).實例變量和基類中的perimeter()
方法應該自動對其可用,而無需重新定義。
由于矩形的相對邊是相同的,我們只需要兩個相鄰的邊來構造它的對象。因此,__init__()
方法的另外兩個參數被設置為無。 方法使用 super() 函數將參數轉發給其基(四邊形)類的構造器。 對象初始化時將side3
和side4
設置為無。 矩形類的構造器使對邊相等。請記住,它已經自動繼承了perimeter()
方法,因此沒有必要重新定義它。
Example: Inheritance
class rectangle(quadriLateral):
def __init__(self, a, b):
super().__init__(a, b, a, b)
我們現在可以聲明矩形類的對象并調用perimeter()
方法。
>>> r1=rectangle(10, 20)
>>> r1.perimeter()
perimeter=60
在 Python 中重寫
在上面的例子中,我們看到了如何在構造繼承類時重用基類的資源。但是,繼承的類可以有自己的實例屬性和方法。
父類的方法可用于繼承的類。但是,如果需要,我們可以修改任何基類方法的功能。為此,繼承的類包含方法的新定義(與基類中已經存在的名稱和簽名相同)。很自然,一個新類的對象可以訪問這兩種方法,但是當被調用時,來自它自己的類的對象將具有優先權。這稱為方法重寫。
首先,我們將在矩形類中定義一個名為area()
的新方法,并將其用作square
類的基礎。矩形的面積是其相鄰邊的乘積。
Example:
class rectangle(QuadriLateral):
def __init__(self, a,b):
super().__init__(a, b, a, b)
def area(self):
a = self.side1 * self.side2
print("area of rectangle=", a)
讓我們定義繼承矩形類的正方形類。area()
方法被覆蓋,以實現將正方形面積作為其邊的正方形的公式。
Example:
class square(rectangle):
def __init__(self, a):
super().__init__(a, a)
def area(self):
a=pow(self.side1, 2)
print('Area of Square: ', a)
>>>s=Square(10)
>>>s.area()
Area of Square: 100
```****