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

你可能感兴趣的:(Python,python,开发语言,后端)