在本教程中,我們將學(xué)習(xí)多態(tài),不同類型的多態(tài)以及如何借助示例演示在Python中實現(xiàn)它們。
多態(tài)性的字面意思是指以不同形式出現(xiàn)的條件。
多態(tài)是編程中非常重要的概念。它指的是使用單個類型實體(方法,運算符或?qū)ο螅﹣肀硎静煌瑘鼍爸械牟煌愋汀?/p>
讓我們舉個實例:
我們知道 + 運算符已在Python程序中廣泛使用。但是,它沒有單一用法。
對于整數(shù)數(shù)據(jù)類型,使用 + 運算符執(zhí)行算術(shù)加法運算。
num1 = 1 num2 = 2 print(num1+num2)
因此,以上程序輸出 3
類似地,對于字符串?dāng)?shù)據(jù)類型,使用 + 運算符進(jìn)行連接。
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
結(jié)果,以上程序輸出 : 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"}))輸出結(jié)果
5 3 2
在這里,我們可以看到許多數(shù)據(jù)類型(例如字符串,列表,元組,集合和字典)都可以使用len()函數(shù)。但是,我們可以看到它返回有關(guān)特定數(shù)據(jù)類型的特定信息。

在面向?qū)ο缶幊讨?,多態(tài)是一個非常重要的概念。
要了解有關(guān)Python中OOP的更多信息,請訪問:Python面向?qū)ο缶幊?/a>
在創(chuàng)建類方法時,我們可以使用多態(tài)的概念,因為Python允許不同的類具有相同名稱的方法。
然后,我們可以稍后通過忽略正在使用的對象來概括調(diào)用這些方法。讓我們看一個實例:
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()輸出結(jié)果
Meow 我是一只貓。我的名字是 Kitty. 我是 2.5 歲. Meow Bark 我是一只狗。 我的名字是 Fluffy. 我是 4 歲. Bark
在這里,我們創(chuàng)建了兩個類Cat和Dog。它們具有相似的結(jié)構(gòu),并具有相同的方法名稱info()和make_sound()。
但是,請注意,我們還沒有創(chuàng)建公共的超類或以任何方式將這些類鏈接在一起。即使這樣,我們也可以將這兩個不同的對象打包到一個元組中,并使用一個公共animal變量對其進(jìn)行迭代。由于多態(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())輸出結(jié)果
Circle 我是一個二維的形狀。 正方形的每個角都是90度。 153.93804002589985
在這里,我們可以看到在父類中使用了諸如__str __()之類的未在子類中重寫的方法。
由于多態(tài)性,Python解釋器自動識別出對象a(Square類)的fact()方法被重寫。它使用了在子類中定義的那個。
另一方面,由于對象b的fact()方法沒有被重寫,因此可以從Parent Shape類中使用它。

注意:方法重載是一種無法在Python中創(chuàng)建具有相同名稱但參數(shù)不同的方法的方法。