1、Python中的多态
1.1、多态的示例
class Animal:
def breathe(self):
print("呼吸")
class Fish(Animal):
def breathe(self):
print("鱼用腮呼吸")
class Sheep(Animal):
def breathe(self):
print("羊用肺呼吸")
#佩奇不继承Animal
class Pig():
def breathe(self):
print("佩奇用肺呼吸")
def fun_breathe(Animal):
Animal.breathe()
if __name__ == '__main__':
fish = Fish()
sheep = Sheep()
pig = Pig()
fun_breathe(fish)
fun_breathe(sheep)
fun_breathe(pig)
输出:
鱼用腮呼吸
羊用肺呼吸
佩奇用肺呼吸
1.2、多态的关键函数
- 上例中的这个函数如下
def fun_breathe(Animal):
Animal.breathe()
- 不属任何类
- Animal 参数可以是任何包含breathe方法的类的实例对象,即使这个类不是Animal的派生类
class Animal:
def breathe(self):
print("呼吸")
class Pig():
'''佩奇不继承Animal'''
def breathe(self):
print("佩奇用肺呼吸")
def fun_breathe(Animal):
Animal.breathe()
if __name__ == '__main__':
pig = Pig()
fun_breathe(pig)
输出:
佩奇用肺呼吸
1.3、静态语言 和 动态语言
- 对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用fun_breathe()方法。
- 对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个breathe()方法就可以了,就像1.2中的Pig类,并不继承自Animal,但含有breathe方法,就可以调用fun_breathe()方法。
- 这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子
2、Java类中的多态
- 这里列举Java中的多态只是做个比较,以便更好的理解Python中的多态
2.1、多态的示例
Animal类如下
public class Animal
{
void breathe()
{
System.out.println("呼吸");
}
}
Fish类如下从Animal派生
public class Fish extends Animal
{
public void breathe()
{
System.out.println("鱼用腮呼吸");
}
}
运行函数如下:
public class Run
{
public static void main(String[] args)
{
Animal animal=new Fish();
animal.breathe();
}
}
输出:
鱼用腮呼吸
2.2、多态示例注释
- Fish类继承自Animal
- 鱼是动物,这话没毛病
- 动物是鱼这话就讲不通
- 故Animal的对象可以指向Fish的实例
Animal animal=new Fish();
- Animal的对象指向的是Fish的实例,故
animal.breathe();
会调用Fish类中的breathe - 这是Java中的多态