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
广告