跳转至

简介

在上篇文章中,我们已经介绍了python的如下两种特性:

  • 封装
  • 继承

在本文中,我们会介绍类的另外两种特性:

  • 多态
  • 重载

多态

还记得多态是什么吗?

多态是指通过相同的接口类型来动态的调用不同的底层实现。在C++中,多态需要通过虚函数来实现。

来看一下python对于多态的实现:

 #!/usr/bin/env python3

 class Animal(object):
         def run(self):
                 print("Animal is running...")

 class Cat(Animal):
         def run(self):
                 print("Cat is running...")

 class Dog(Animal):
         def run(self):
                 print("Dog is running...")

 def running(animal):
         animal.run()

 animal = Animal()
 dog = Dog()
 cat = Cat()

 running(animal)
 running(dog)
 running(cat)

从以上代码中,我们可以看到CatDog都继承Animal类, 并重写了run函数,分别将三个实例对象传入running函数,有没有注意到running函数可以根据不同的类型来调用不同的函数。这意味着我们可以继续继承Animal类型产生更多的对象,这些对象都可以在running函数中使用。

鸭子类型

在上面的代码中,我们强调继承Animal类,然后重新实现run函数来实现多态。在running函数中传入Aniaml类型的实例, 来调用该实例的run函数。

那我们如果传入的对象并不是Animal类型,该函数运行会出错吗?

class Car(object):
    def run(self):
        print("Car is running...")

car = Car()
running(car)

可以看出,上面代码依然可以运行,这就是鸭子类型的力量。我们需要一个会runAnimal,但我们传入的对象即使不是Animal,只要这个对象可以run,我们的代码就依然可以运行。

其实本质上是因为python是一门动态语言。

重载

python中并不支持重载的概念。