1. 程式人生 > 其它 >python-面向物件-類的多型-父類方法重寫,繼承多型的表現形式

python-面向物件-類的多型-父類方法重寫,繼承多型的表現形式

1.類的多型

python面向物件的多型依賴於繼承, 因為繼承,使得子類擁有了父類的方法, 子類的方法與父類方法重名時是重寫, 同一類事物,有多重形態, 這就是面向物件概念裡的多型,多型使得不同的子類物件呼叫相同的 類方法,產生不同的執行結果,可以增加程式碼的外部呼叫靈活度。

2.重寫

多型這個概念依賴於繼承,因為繼承,使得子類擁有了父類的方法,這裡就產生了一個問題,如果子類有一個方法和父類的方法同名,那麼子類在呼叫這個方法時,究竟是呼叫子類自己的方法,還是父類的方法?
class Base():
    def print(self):
        print("base")
class A(Base):
    def print(self):
        print(
"A") a = A() a.print()

父類和子類都有print方法,那麼子類A的物件a呼叫print方法時,呼叫的是誰的print方法呢?

答案是子類的print方法,如果A類沒有定義print方法,那麼a.print()呼叫的是父類的print方法,但是A類定義了print方法,這種情況稱之為重寫,A類重寫了父類的print方法。

3.繼承的搜尋

強調繼承時,子類“擁有”父類的方法和屬性,特意加了雙引號,因為,這種擁有不是真實意義上的擁有。
class Base():
    def print(self):
        print("base")
class A(Base):
    pass
print(
id(Base.print)) print(id(A.print))

Base.print 和 A.print 的記憶體地址是相同的,這說明他們是同一個方法。執行A.print時,python會尋找print方法,它會先從A類的定義中尋找,沒有找到,然後去A的父類裡尋找print方法,如果還是找不到,就繼續向上尋找。

這便是子類擁有父類屬性和方法的真相。

4.多型的表現形式

同一類事物,有多重形態

class Animal:
    def run(self):
        raise NotImplementedError

class People(Animal):
    def run(self):
        print(
"人在行走") class Pig(Animal): def run(self): print("豬在跑") p1 = People() p1.run() p2 = Pig() p2.run()

People和 Pig 都繼承了Animal,都是動物,是同一類事物,他們都有run方法,但是最終的執行結果卻不一樣,這就是多型,同一類事物有多種形態。