Python - 多型



什麼是 Python 中的多型?

術語多型指的是函式或方法在不同上下文中採用不同的形式。由於 Python 是一種動態型別語言,因此 Python 中的多型非常容易實現。

如果父類中的某個方法在不同的子類中被覆蓋了不同的業務邏輯,那麼基類方法就是一個多型方法。

在 Python 中實現多型的方法

在 Python 中實現多型有四種方法:

  • 鴨子型別
  • 運算子過載
  • 方法重寫
  • 方法過載
implementing polymorphism

Python 中的鴨子型別

鴨子型別是一個概念,其中物件的型別或類不如其定義的方法重要。使用此概念,您可以呼叫物件的任何方法而無需檢查其型別,只要該方法存在即可。

這個術語是由一句非常著名的引言定義的:假設有一隻鳥,它像鴨子一樣行走,像鴨子一樣游泳,像鴨子一樣看起來,像鴨子一樣嘎嘎叫,那麼它可能就是一隻鴨子。

示例

在下面給出的程式碼中,我們正在實際演示鴨子型別的概念。

class Duck:
   def sound(self):
      return "Quack, quack!"

class AnotherBird:
   def sound(self):
      return "I'm similar to a duck!"

def makeSound(duck):
   print(duck.sound())

# creating instances
duck = Duck()
anotherBird = AnotherBird()
# calling methods
makeSound(duck)   
makeSound(anotherBird) 

執行此程式碼時,將產生以下輸出:

Quack, quack!
I'm similar to a duck!

Python 中的方法重寫

方法重寫中,子類中定義的方法與超類中的方法具有相同的名稱,但實現了不同的功能。

示例

作為一個多型的示例,如下所示,我們有shape是一個抽象類。它被兩個類 circle 和 rectangle 用作父類。這兩個類都以不同的方式覆蓋了父類的 draw() 方法。

from abc import ABC, abstractmethod
class shape(ABC):
   @abstractmethod
   def draw(self):
      "Abstract method"
      return

class circle(shape):
   def draw(self):
      super().draw()
      print ("Draw a circle")
      return

class rectangle(shape):
   def draw(self):
      super().draw()
      print ("Draw a rectangle")
      return

shapes = [circle(), rectangle()]
for shp in shapes:
   shp.draw()

輸出

執行上述程式碼時,將產生以下輸出:

Draw a circle
Draw a rectangle

變數shp首先引用 circle 物件並呼叫 circle 類中的 draw() 方法。在下次迭代中,它引用 rectangle 物件並呼叫 rectangle 類中的 draw() 方法。因此,shape 類中的 draw() 方法是多型的。

在 Python 中過載運算子

假設您建立了一個 Vector 類來表示二維向量,當您使用加號運算子將它們加在一起時會發生什麼?很可能 Python 會對你大喊大叫。

但是,您可以在類中定義__add__方法來執行向量加法,然後加號運算子將按預期工作:

示例

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)

執行上述程式碼時,會產生以下結果:

Vector(7,8)

Python 中的方法過載

當一個類包含兩個或多個名稱相同但引數數量不同的方法時,這種情況可以稱為方法過載。

Python 預設不允許過載方法,但是,我們可以使用可變長度引數列表、多重分派和預設引數等技術來實現此目的。

示例

在以下示例中,我們使用可變長度引數列表來實現方法過載。

def add(*nums):
   return sum(nums)

# Call the function with different number of parameters
result1 = add(10, 25)
result2 = add(10, 25, 35)

print(result1)  
print(result2) 

執行上述程式碼時,會產生以下結果:

35
70
廣告