多态指的是一类事物有多种形态,多态性是指在不考虑实例类型的情况下使用实例
class Animals:
def run(self):
print('running')
class Dog(Animals):
def run(self):
print('dog is running')
class Pig(Animals):
def run(self):
print('pig is running')
def func(animal):
animal.run()
dog = Dog()
func(dog)
pig = Pig()
func(pig)
pig 和dog都是动物,都会有run 功能,我们在使用实例时不必考虑是pig还是dog,只要是动物,就会有run。
我们可以定义一个功能,func,传入dog时,打印dog is running,传入pig时
pig is running。
class Cat(Animals):
def run(self):
print('cat is running')
cat = Cat()
func(cat)
如果我们新增一个类,此时不必对func做任何修改,只知道它是animals类型,就能直接调用cat,这就是多态。只要func函数正常,我们只要知道它是Animals类型,不用修改函数func,只管调用就可以,即使新增了类,只要保证是同一类型,都可以同一种形式去调用,增加了程序的灵活性和可扩展性。
更进一步,则不一定需要传入Animals类型。我们只需要保证传入的对象有一个run()方法就可以了:
class Car:
def run(self):
print('car is running')
car = Car()
func(car)
car is running
这就是动态语言的“鸭子类型”,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子,就像之前学过的序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系,都可以用 len()方法一样。