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 面向对象之多态概念和示例的学习笔记。

相关推荐

  1. Python 面向对象

    2024-01-13 22:46:07       64 阅读
  2. python 面向对象(封装、继承、)

    2024-01-13 22:46:07       40 阅读
  3. Python基础20 面向对象(3)、封装、反射

    2024-01-13 22:46:07       51 阅读
  4. Python编程的面向对象(二)—类的

    2024-01-13 22:46:07       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 22:46:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 22:46:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 22:46:07       87 阅读
  4. Python语言-面向对象

    2024-01-13 22:46:07       96 阅读

热门阅读

  1. 编程探秘:Python深渊之旅-----调试的艺术(四)

    2024-01-13 22:46:07       71 阅读
  2. C++入门【25-C++ 从函数返回指针】

    2024-01-13 22:46:07       67 阅读
  3. Pandas实战100例 | 案例 25: 计算相关系数

    2024-01-13 22:46:07       62 阅读
  4. SpringBoot全局配置Long转String丢失精度的问题解决

    2024-01-13 22:46:07       60 阅读
  5. 【Leetcode】268.丢失的数字

    2024-01-13 22:46:07       57 阅读
  6. tar命令使用

    2024-01-13 22:46:07       52 阅读
  7. FreeSWITCH CentOS7下源码编译mod_mariadb

    2024-01-13 22:46:07       65 阅读
  8. 开源协议概览

    2024-01-13 22:46:07       57 阅读