在强类型语言(例如Java或C#)中,多态是指允许使用一个父类类型的变量或常量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果。即使用父类的类型来调用子类的方法。
在Python中,多态指在不考虑对象类型的情况下使用对象。相比于强类型,Python更推崇“鸭子类型”。“鸭子类型”是这样推断的:如果一只生物走起路来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那么它就可以当做鸭子。也就是说,它不关注对象的类型,而是关注对象具有的行为。
例12-7 多态.py
# 定义一个表示动物的类
class Animal(object):
def shout(self): # 叫的方法
print("--Animal--shout--")
# 定义一个表示狗的类,继承自动物类
class Dog(Animal):
def shout(self): # 重写父类的方法
print("--汪汪--")
# 定义一个表示猫的类,继承自动物类
class Cat(Animal):
def shout(self): # 重写父类的方法
print("--喵喵--")
# 定义一个函数
def func(temp):
temp.shout()
dog = Dog()
func(dog)
cat = Cat()
func(cat)
在例12-7中,首先定义了Animal(动物)类,该类中有个shout方法,其次定义了继承自Animal的两个子类Dog(狗)和Cat(猫),分别在两个类中重写了shout方法,然后定义了一个带参数的函数func,在该函数中调用了shout方法,最后分别创建了Dog类的对象dog和Cat类的对象cat,并作为参数调用了func函数。
程序运行的结果如图12-12所示。
图12-12 运行结果
值得一提的是,func函数中没有规定参数temp类型,它可以接收任意类型的对象,但是传入的这些对象中必须有shout方法。