Python 简明教程
Python - Polymorphism
What is Polymorphism in Python?
术语 polymorphism 指的是在不同上下文中采用不同形式的函数或方法。由于 Python 是动态类型语言,因此 Python 中的多态性很容易实现。
如果某个父类中的方法在它的不同子类中由不同的业务逻辑覆盖,则这个基类方法就是一个多态方法。
Ways of implementing Polymorphism in Python
有四种方法可以在 Python 中实现多态性 −
-
Duck Typing
-
Operator Overloading
-
Method Overriding
-
Method Overloading
Duck Typing in Python
鸭子类型是一种概念,其中对象类型或类不如它定义的方法重要。使用此概念,只要该方法存在,就可以在对象上调用任何方法,而无需检查其类型。
这个术语由一句很有名的引用来定义,叫做:假设有一只鸟像鸭子一样走路,像鸭子一样游泳,看起来像鸭子,并且嘎嘎叫,那么它很可能是一只鸭子。
Example
在下面给出的代码中,我们实际展示了鸭子类型的概念。
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!
Method Overriding in Python
在方法重写中,在子类中定义的方法具有与其超类中的方法相同的名字,但实现了不同的功能。
Example
作为下面给出的多态性示例,我们有 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()
Overloading Operators in Python
假设你创建了一个表示二维向量的 Vector 类,当你使用加号运算符给它们相加时会发生什么?Python 很可能会向你大喊大叫。
但是,您可以在自己的类中定义 add 方法来执行向量加法,然后加法运算符将按预期的那样执行 −