Python学海无涯路【第35回】:类的多态


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中的多态
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值