Python - 方法過載



方法過載是面向物件程式設計的一個特性,其中一個類可以有多個同名但引數不同的方法。要過載方法,我們必須更改引數的數量或引數的型別,或兩者兼而有之。

Python 中的方法過載

與 Java、C++ 和 C# 等其他程式語言不同,Python 預設不支援方法過載功能。但是,有一些替代方法可以實現它。

示例

如果您多次定義一個方法,如下面的程式碼所示,則最後一個定義將覆蓋之前的定義。因此,這種在 Python 中實現方法過載的方式會產生錯誤。

class example:
   def add(self, a, b):
      x = a+b
      return x
   def add(self, a, b, c):
      x = a+b+c
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

第一次使用三個引數呼叫 add() 方法是成功的。但是,呼叫類中定義的只有兩個引數的 add() 方法失敗了。

60
Traceback (most recent call last):
 File "C:\Users\user\example.py", line 12, in <module>
  print (obj.add(10,20))
         ^^^^^^^^^^^^^^
TypeError: example.add() missing 1 required positional argument: 'c'

輸出告訴您,Python 只考慮 add() 方法的最新定義,丟棄了之前的定義。

為了模擬方法過載,我們可以使用一種變通方法,為方法引數定義預設值為 None,以便它可以用於一個、兩個或三個引數。

示例

下面的示例演示瞭如何在 Python 中實現方法過載:

class example:
   def add(self, a = None, b = None, c = None):
      x=0
      if a !=None and b != None and c != None:
         x = a+b+c
      elif a !=None and b != None and c == None:
         x = a+b
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

它將產生以下輸出

60
30

透過這種變通方法,我們能夠在 Python 類中加入方法過載。

使用 MultipleDispatch 實現方法過載

Python 的標準庫沒有其他實現方法過載的規定。但是,我們可以為此目的使用名為MultipleDispatch 的第三方模組中的分派函式。

首先,您需要使用以下命令安裝Multipledispatch 模組:

pip install multipledispatch

此模組有一個@dispatch 裝飾器。它需要傳遞給要過載的方法的引數數量。如下所示,使用 @dispatch 裝飾器定義 add() 方法的多個副本:

示例

在這個例子中,我們使用 multipledispatch 在 Python 中過載一個方法。

from multipledispatch import dispatch
class example:
   @dispatch(int, int)
   def add(self, a, b):
      x = a+b
      return x
   @dispatch(int, int, int)
   def add(self, a, b, c):
      x = a+b+c
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

輸出

60
30
廣告