介绍
多态性是为不同的基础形式(例如,数据类型或类)利用同一接口的能力。这允许函数在不同时间使用不同类型的实体。
对于Python中的面向对象编程,这意味着可以用与属于特定类的特定对象相同的方式来使用它,就好像它是属于不同类的不同对象一样。
多态性提供了灵活性和松散的耦合,因此可以随时间扩展代码,并且轻松维护它们。
本教程将介绍如何将多态应用于Python中的类。
创建多态类
为了使用多态性,我们创建两个不同的类,用于两个不同的对象,每一个不同的类都需要有一个共同的接口,这样它们就可以被多态地使用,所以,我们为它们提供不同但有相同名称的方法。
我们创建一个Shark类和Clownfish类,每个类都将定义swim(),swim_backwards()和skeleton()的方法。polymorphic_fish.pyclass Shark():
def swim(self):
print("The shark is swimming.")
def swim_backwards(self):
print("The shark cannot swim backwards, but can sink backwards.")
def skeleton(self):
print("The shark's skeleton is made of cartilage.")
class Clownfish():
def swim(self):
print("The clownfish is swimming.")
def swim_backwards(self):
print("The clownfish can swim backwards.")
def skeleton(self):
print("The clownfish's skeleton is made of bone.")
上面的代码中,Shark和Clownfish类都有三个相同名称相同的方法,但是,这些方法的每个功能对于每个类都不同。
让我们将这些类实例化为两个对象:polymorphic_fish.py...
sammy = Shark()
sammy.skeleton()
casey = Clownfish()
casey.skeleton()
当使用python polymorphic_fish.py命令运行程序时,我们可以看到每个对象都按照预期的方式运行:OutputThe shark's skeleton is made of cartilage.
The clownfish's skeleton is made of bone.
现在,我们有两个使用通用接口的对象,无论它们的类型如何,我们都可以以相同的方式使用这两个对象。
多态性与类方法
为了展示Python如何以相同的方式使用这些不同的类类型,我们首先可以创建一个遍历对象元组的for循环。然后我们可以调用这些方法,而不用关心每个对象是什么类型的,我们仅假设这些方法实际上存在于每个类中。polymorphic_fish.py...
sammy = Shark()
casey = Clownfish()
for fish in (sammy, casey):
fish.swim()
fish.swim_backwards()
fish.skeleton()
我们有两个对象,Shark类的sammy和Clownfish类的casey ,我们的for循环迭代这些对象,在每个对象上调用swim(),swim_backwards()和skeleton()方法。
运行程序时,输出将如下所示:OutputThe shark is swimming.
The shark cannot swim backwards, but can sink backwards.
The shark's skeleton is made of cartilage.
The clownfish is swimming.
The clownfish can swim backwards.
The clownfish's skeleton is made of bone.
for循环首先通过Shark类的sammy实例化,然后是Clownfish类的casey对象,先看到与Shark类相关的方法。
这表明python在不知道或关心每个对象的类类型的情况下使用了这些方法,也就是说,以多态方式使用了这些方法。
函数的多态性
我们还可以创建一个可以接受对象的函数,从而实现多态。
我们创建一个叫in_the_pacific()的函数,它接受一个我们可以调用fish的对象,使用的是名称fish,实例化的对象都可以被调用到这个函数中:polymorphic_fish.py...
def in_the_pacific(fish):
接下来,我们给函数一些使用我们传递给它的fish对象的函数,在这种情况下,我们调用swim()方法,其中每个方法都在两个类Shark和Clownfish中定义:polymorphic_fish.py...
def in_the_pacific(fish):
fish.swim()
接下来,如果没有它们,我们创建Shark和Clownfish类的实例化,使用这些函数,我们可以使用相同的in_the_pacific()函数调用它们的操作:polymorphic_fish.py...
def in_the_pacific(fish):
fish.swim()
sammy = Shark()
casey = Clownfish()
in_the_pacific(sammy)
in_the_pacific(casey)
运行程序时,输出将如下所示:OutputThe shark is swimming.
The clownfish is swimming.
尽管我们在定义时将随机对象(fish )传递给in_the_pacific()函数,但是仍然能够有效地实例化Shark和Clownfish类,casey对象调用Clownfish类中的swim()方法,而sammy对象调用在Shark类中定义的swim()方法。
结束语
通过允许不同的对象通过多态的方式使用函数和方法,利用这个Python功能可为你的面向对象的代码提供更大的灵活性和可扩展性。