Python中方法過載和方法覆蓋的區別


在Python的面向物件程式設計(OOP)中,方法非常重要。它們對於隔離類中的功能以及賦予物件執行特定任務的能力至關重要。但是,兩個OOP概念——**方法過載**和**方法覆蓋**——有時會造成混淆。本文將討論這兩個概念之間的區別及其在Python中的應用。

語法

在Python中定義方法需要使用“def”關鍵字,方法名,引數和方法體。

def method_name(parameter1, parameter2, ...):
   # method body
   return value

比較表

方法過載

方法覆蓋

指定義多個具有相同名稱但引數不同的方法

指在子類中定義一個與超類中方法同名的方法

在Python中可以使用預設引數實現

可以透過在子類中定義與超類中同名的方法來實現

允許一個類具有多個同名但根據輸入引數具有不同行為的方法

允許子類提供其自身對超類中定義的方法的實現

呼叫哪個方法的選擇是在編譯時根據傳遞給方法的引數數量和型別確定的

呼叫哪個方法的選擇是在執行時根據實際引用的物件確定的

Python原生不支援

Python原生支援

示例

示例1:方法過載

方法過載是指定義多個具有相同名稱但引數型別或引數數量不同的方法。在Python中,方法過載是使用預設引數實現的。

class MyClass:
   def my_method(self, arg1, arg2=None):
      if arg2:
         print(arg1 + arg2)
      else:
         print(arg1)

# Calling the method with one argument
obj = MyClass()
obj.my_method(10)

# Calling the method with two arguments
obj.my_method(10, 20) 

輸出

10
30

在這個例子中,我們定義了一個名為“my_method”的方法,它接受兩個引數,第二個引數是可選的。如果存在第二個引數,該方法將新增這兩個引數;否則,將列印第一個引數。

示例2:方法覆蓋

另一方面,方法覆蓋是指在子類中定義一個與超類中同名的方法。然後,子類方法將覆蓋超類方法。

class Animal:
   def speak(self):
      print("Animal Speaking!")
class Dog(Animal):
   def speak(self):
      print("Dog barking!")
obj = Dog()
obj.speak()

輸出

Dog barking!

如上所示,我們有一個“Dog”子類和一個“Animal”超類。“Animal”類的“speak”方法被“Dog”類的“speak”方法覆蓋。現在,讓我們來看一個包含方法過載和方法覆蓋的完整的Python程式碼塊:

class Parent:
   def my_method(self, arg1, arg2):
      print("Parent my_method")
class Child(Parent):
   def my_method(self, arg1):
      print("Child my_method")
obj = Child()
obj.my_method("Hello") 

輸出

Child my_method

在本例中,我們也有一個名為“Parent”的超類和一個名為“Child”的子類。“Child”類有一個名為“my_method”的方法,它只接受一個引數,而“Parent”類的“my_method”方法接受兩個引數。當在“Child”類例項上呼叫時,只接受一個引數的“my_method”方法將被呼叫。

示例

class Shape:
   def area(self):
      pass
class Rectangle(Shape):
   def __init__(self, length, breadth):
      self.length = length
      self.breadth = breadth
   def area(self):
      return self.length * self.breadth
class Circle(Shape):
   def __init__(self, radius):
      self.radius = radius
   def area(self):
      return 3.14 * self.radius * self.radius
   def area(self, diameter):
      self.radius = diameter / 2
      return 3.14 * self.radius * self.radius
r = Rectangle(5, 10)
print("Area of rectangle:", r.area())
c = Circle(7)
print("Area of circle with radius 7:", c.area())
print("Area of circle with diameter 10:", c.area(10)) 

輸出

Area of rectangle: 50
Area of circle with radius 7: 153.86
Area of circle with diameter 10: 78.5

這裡,“Circle”和“Rectangle”都修改了基本“Shape”類的`area()`方法。“Circle”類覆蓋了`area()`方法來計算指定半徑的圓的面積,“Rectangle”類定義了自己的`area()`方法版本來計算矩形的面積。“Circle”類還透過新增第二個`area()`函式來計算指定直徑的圓的面積來演示方法過載。在這個例子中,我們也有超類“Father”和子類“Child”。“Parent”類的“my_method”方法接受兩個引數,而“Child”類的方法只接受一個引數。

當建立一個“Rectangle”類的例項並使用其`area()`方法時,矩形的面積為50平方英尺。當我們使用半徑為7的例項時,“Circle”類的`area()`方法返回圓的面積,大約為153.86。最後,我們使用直徑為10的圓,並呼叫“Circle”類的`area()`方法來查詢圓的面積,大約為78.5。

結論

在探索面向物件程式設計的世界時,理解方法過載和方法呼叫之間的細微差別至關重要。這兩個概念經常被混淆,這可能會導致未來的問題和不確定性。方法過載是指定義多個具有相同名稱但引數不同的方法的技術。這與方法覆蓋形成對比,方法覆蓋是在子類中建立與超類中同名的方法。要在Python中覆蓋方法,必須提供與超類中同名的方法。預設引數通常被用作解決方法過載的辦法。

更新於:2023年4月18日

8000+瀏覽量

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告