Python 面向对象之多态

多态:一种事物的多种形态

 

目录

场景

创建猫类

创建狗类

创建人类

开始喂养

场景优化

创建动物类

修改狗类

修改猫类

开始喂养

优化喂养

调用动物喂养

总结


场景

定义一个人,他可以喂养两个动物:一个猫和一只狗

需要创建人类、猫类、狗类。

创建猫类

在构造函数中设定动物的名称,创建一个吃食物的方法。

示例如下:

class Cat(object):

    def __init__(self, name):
        self.name = name

    def eat(self):
        print(self.name, '吃')

 

创建狗类

在构造函数中设定动物的名称,创建一个吃食物的方法。

示例如下:

class Dog(object):

    def __init__(self, name):
        self.name = name

    def eat(self):
        print(self.name, '吃')

创建人类

引入刚才创建的猫和狗类,并在Person类中创建两个喂养方法。

示例如下:

from Dog import Dog
from Cat import Cat

class Person(object):

    def food_dog(self, dog):
        print('给你食物')
        dog.eat()

    def food_cat(self, cat):
        print('给你食物')
        cat.eat()

开始喂养

在当前person文件中,实例化person类,

然后创建一个狗和猫,调用人类的喂养狗和猫方法。

示例如下:

p1 = Person()

dog1 = Dog('旺财')
p1.food_dog(dog1)

cat1 = Cat('大橘')
p1.food_cat(cat1)

执行结果:

给你食物

旺财 吃

给你食物

大橘 吃

场景优化

思考:添加100种动物,也都有name属性和eat方法;

如果每次新添加一个动物就创建一个新的相应动物类,这似乎太繁琐了。

解决方法:定义一个有name属性和eat方法的动物类,让所有动物都继承自动物类。

最终目标:人可以喂养任何一种动物

创建动物类

在原来狗和猫类的基础上抽象出一个动物基类,来存放它们的共同属性和方法。

示例如下:

class Animal(object):
    # 动物类

    def __init__(self, name):
        self.name = name

    def eat(self):
        print(self.name, '吃')

修改狗类

在原来的基础上需要引入Animal类到当前命名空间,之后继承Animal类;

在构造函数中实现父类构造函数属性赋值,并去掉原有的eat函数。

示例如下:

from Animal import Animal
class Dog(Animal):

    def __init__(self, name):
        super(Dog, self).__init__(name)

修改猫类

修改与小狗类的一样。在原来的基础上引入Animal类到当前命名空间,继承Animal类;

在构造函数中实现父类构造函数属性赋值,并去掉原有的eat函数。

示例如下:

from Animal import Animal
class Cat(Animal):

    def __init__(self, name):
        super(Cat, self).__init__(name)

开始喂养

实例化Person类调用原来的喂养方法,执行结果未发生改变。

示例如下:

p1 = Person()

dog1 = Dog('旺财')
p1.food_dog(dog1)

cat1 = Cat('大橘')
p1.food_cat(cat1)

 

优化喂养

思考:人每新增加一种动物,都需要写一个相应feed方法,

还需要进一步去优化。

解决:统一为一个动物喂养方法;

在person类中增加一个喂养动物的方法,

所有动物都可以使用此方法来喂养动物。

示例如下:

from Dog import Dog
from Cat import Cat

class Person(object):

    def food_dog(self, dog):
        print('给你食物')
        dog.eat()

    def food_cat(self, cat):
        print('给你食物')
        cat.eat()

    def food_animal(self, animal):
        print('给你食物')
        animal.eat()

调用动物喂养

原有的喂养小狗和小猫的方法都改为使用动物喂养的方法。

示例如下:

p1 = Person()
dog1 = Dog('旺财')
p1.food_animal(dog1)
dog2 = Dog('二狗')
p1.food_animal(dog2)
cat1 = Cat('大橘')
p1.food_animal(cat1)
cat2 = Cat('二橘')
p1.food_animal(cat2)

执行结果:

给你食物

旺财 吃

给你食物

二狗 吃

给你食物

大橘 吃

给你食物

二橘 吃

总结

本篇为Python 面向对象之多态概念和示例的学习笔记。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值