在 Python 中,多態(Polymorphism)是指不同的對象可以對相同的消息(方法調用)做出不同的響應。 簡單來說,多態允許使用一個統一的接口來操作不同類型的對象,而這些對象會根據自身的類型來執行相應的具體操作。 例如,假設有一個父類 `Shape` 和幾個子類 `Circle`、`Rectangle` 、`Triangle` ,它們都有一個 `area` 方法來計算面積。
class Shape:def area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2class Rectangle(Shape):def __init__(self, length, width):self.length = lengthself.width = widthdef area(self):return self.length * self.widthclass Triangle(Shape):def __init__(self, base, height):self.base = baseself.height = heightdef area(self):return 0.5 * self.base * self.height
然后,可以創建這些不同形狀的對象,并通過相同的方式調用?area
?方法來獲取它們各自的面積計算結果。
shapes = [Circle(5), Rectangle(4, 6), Triangle(3, 8)]for shape in shapes:print(shape.area())
盡管都是調用?area
?方法,但不同的子類對象會根據自己的實現計算并返回不同的結果,這就是多態的體現。它增加了代碼的靈活性和可擴展性,使得程序更易于維護和擴展。?
多態性 示例:
#多態#繼承:多態一定是發生在子類和父類之間的重寫:子類重寫父類中的方法class Animal:def say(self):print('animal')class Cat(Animal):def say(self):print('I am a cat')class Dog(Animal):def say(self):print('I am a dog')class Duck(Animal):def say(self):print('I am a duck')duck=Duck()
duck.say()dog=Dog()
dog.say()#輸出分別為:
#I am a duck
#I am a dog
子類重寫父類方法后同一個方法‘say’的輸出不同,即呈現多態性。
在 Python 中,鴨子類型(Duck Typing)是一種編程風格。
其理念是:如果一個對象的行為(方法和屬性)看起來像鴨子,走路像鴨子,叫聲像鴨子,那么我們就可以把它當作鴨子。
換句話說,在使用對象時,不關注對象的類型,而是關注對象是否具有所需的方法和屬性。只要對象具有所需的方法和屬性,就可以在相應的上下文中使用,而不管它具體屬于哪個類。
例如,如果有兩個類?Bird
?和?Plane
?,它們都有一個?fly
?方法。
class Bird:def fly(self):print("Bird is flying")class Plane:def fly(self):print("Plane is flying")def make_fly(obj):obj.fly()
在某個函數中,如果需要一個能夠“飛行”的對象,我們可以接受這兩個類的實例,因為它們都具有?fly
?方法,符合“能夠飛行”的要求。
bird = Bird()
# 創建了一個 `Bird` 類的實例 `bird`plane = Plane()
# 創建了一個 `Plane` 類的實例 `plane`make_fly(bird)
# 調用 `make_fly` 函數,并將 `bird` 作為參數傳遞進去
# 在函數內部,通過 `obj.fly()` 調用了 `Bird` 類中定義的 `fly` 方法,輸出 "Bird is flying"make_fly(plane)
# 調用 `make_fly` 函數,并將 `plane` 作為參數傳遞進去
# 在函數內部,通過 `obj.fly()` 調用了 `Plane` 類中定義的 `fly` 方法,輸出 "Plane is flying"
?這種編程風格強調的是對象的行為,而不是對象的類型,使得代碼更加靈活和可擴展。
鴨子類型示例:
#鴨子類型:長得像鴨子,它就是鴨子類型#多個類中實現了同一個方法(當前的方法名一樣)
class Cat:def say(self):print('I am a cat')class Dog:def say(self):print('I am a dog')class Duck:def say(self):print('I am a duck')animal = Cat
animal().say()animal = Dog
animal().say()#輸出:I am a cat
I am a dog#這也是一種多態的體現