多态:一种事物的多种形态
?
目录
定义一个人,他可以喂养两个动物:一个猫和一只狗
需要创建人类、猫类、狗类。
在构造函数中设定动物的名称,创建一个吃食物的方法。
示例如下:
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 面向对象之多态概念和示例的学习笔记。