在本教程中,我們將學習多態(tài),不同類型的多態(tài)以及如何借助示例演示在Python中實現(xiàn)它們。
多態(tài)性的字面意思是指以不同形式出現(xiàn)的條件。
多態(tài)是編程中非常重要的概念。它指的是使用單個類型實體(方法,運算符或對象)來表示不同場景中的不同類型。
讓我們舉個實例:
我們知道 + 運算符已在Python程序中廣泛使用。但是,它沒有單一用法。
對于整數(shù)數(shù)據(jù)類型,使用 + 運算符執(zhí)行算術加法運算。
num1 = 1 num2 = 2 print(num1+num2)
因此,以上程序輸出 3
類似地,對于字符串數(shù)據(jù)類型,使用 + 運算符進行連接。
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
結果,以上程序輸出 : Python Programming
在這里,我們可以看到使用運算符 + 對不同的數(shù)據(jù)類型執(zhí)行了不同的操作。這是Python中最簡單的多態(tài)現(xiàn)象之一。
Python中有一些函數(shù)可以與多種數(shù)據(jù)類型兼容。
其中一種這樣的函數(shù)是len()函數(shù)。它可以在Python中與許多數(shù)據(jù)類型一起運行。讓我們看一下該函數(shù)的一些示例用例。
print(len("nhooo")) print(len(["Python", "Java", "C"])) print(len({"Name": "John", "Address": "Nepal"}))
輸出結果
5 3 2
在這里,我們可以看到許多數(shù)據(jù)類型(例如字符串,列表,元組,集合和字典)都可以使用len()函數(shù)。但是,我們可以看到它返回有關特定數(shù)據(jù)類型的特定信息。
在面向對象編程中,多態(tài)是一個非常重要的概念。
要了解有關Python中OOP的更多信息,請訪問:Python面向對象編程
在創(chuàng)建類方法時,我們可以使用多態(tài)的概念,因為Python允許不同的類具有相同名稱的方法。
然后,我們可以稍后通過忽略正在使用的對象來概括調用這些方法。讓我們看一個實例:
class Cat: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"我是一只貓。我的名字是 {self.name}. 我是 {self.age} 歲.") def make_sound(self): print("Meow") class Dog: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"我是一只狗。 我的名字是 {self.name}. 我是 {self.age} 歲.") def make_sound(self): print("Bark") cat1 = Cat("Kitty", 2.5) dog1 = Dog("Fluffy", 4) for animal in (cat1, dog1): animal.make_sound() animal.info() animal.make_sound()
輸出結果
Meow 我是一只貓。我的名字是 Kitty. 我是 2.5 歲. Meow Bark 我是一只狗。 我的名字是 Fluffy. 我是 4 歲. Bark
在這里,我們創(chuàng)建了兩個類Cat和Dog。它們具有相似的結構,并具有相同的方法名稱info()和make_sound()。
但是,請注意,我們還沒有創(chuàng)建公共的超類或以任何方式將這些類鏈接在一起。即使這樣,我們也可以將這兩個不同的對象打包到一個元組中,并使用一個公共animal變量對其進行迭代。由于多態(tài)性,這是允許的。
與其他編程語言一樣,Python中的子類也從父類繼承方法和屬性。我們可以專門針對子類重新定義某些方法和屬性,這稱為Method Overriding(方法重寫)。
多態(tài)性使我們能夠訪問與父類同名的這些覆蓋的方法和屬性。
讓我們看一個實例:
from math import pi class Shape: def __init__(self, name): self.name = name def area(self): pass def fact(self): return "我是一個二維的形狀。" def __str__(self): return self.name class Square(Shape): def __init__(self, length): super().__init__("Square") self.length = length def area(self): return self.length**2 def fact(self): return "正方形的每個角都是90度。" class Circle(Shape): def __init__(self, radius): super().__init__("Circle") self.radius = radius def area(self): return pi*self.radius**2 a = Square(4) b = Circle(7) print(b) print(b.fact()) print(a.fact()) print(b.area())
輸出結果
Circle 我是一個二維的形狀。 正方形的每個角都是90度。 153.93804002589985
在這里,我們可以看到在父類中使用了諸如__str __()之類的未在子類中重寫的方法。
由于多態(tài)性,Python解釋器自動識別出對象a(Square類)的fact()方法被重寫。它使用了在子類中定義的那個。
另一方面,由于對象b的fact()方法沒有被重寫,因此可以從Parent Shape類中使用它。
注意:方法重載是一種無法在Python中創(chuàng)建具有相同名稱但參數(shù)不同的方法的方法。