首先在初接触Python就应该知道的,Python是弱类型编程语言
因此,Python中不支持多态,也用不到多态,多态的概念是应⽤于java和C#这些强类型语⾔中的,但是Python崇尚“鸭子形态”。
那么问题来了,什么是“鸭子形态”呢??
这个概念源自詹姆斯.惠特科姆.莱利的一首诗:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
在Python中的理解为:两个类的实例之间可以没有任何联系,只要两个实例之间的方法一致(要求方法名字和参数必须一致),就可以产生多态。
二、上代码来一个简单得代码理解Python中的“鸭子形态”
class Pet(object):
def __init__(self, kind):
self.kind = kind
def eatFood(self):
print(f'我有一只宠物{self.kind},它正在吃东西......')
class Dog(Pet):
def __init__(self, kind):
super(Dog, self).__init__(kind)
def eatFood(self): # 重写父类
print('小狗正在啃骨头!!!')
class Cat(Pet):
def __init__(self, kind):
super(Cat, self).__init__(kind)
def eatFood(self): # 重写父类
print('猫咪正在吃鱼!!!')
class CShu(Pet):
def __init__(self, kind):
super(CShu, self).__init__(kind)
def eatFood(self): # 重写父类
print('仓鼠正在吃杂粮!!!')
class Master(object):
def feed(self, pet):
# 相当于dog.eatFood()、cat.eatFood()、cshu.eatFood()
pet.eatFood()
if __name__ == '__main__':
dog = Dog('狗狗') # 创建Dog类的实例
cat = Cat('猫咪') # 创建Cat类的实例
cshu = CShu('仓鼠') # 创建CShu类的实例
master = Master()
# 可以将实例对象当作数据传递给Master类
master.feed(dog)
master.feed(cat)
master.feed(cshu)
代码中Pet为父类,Dog、Cat、CShu为Pet的子类,继承Pet内所有的属性和方法
变形练习:
- 生成一个学生类,包含一个zaozixi方法
- 生成三个子类,并且各自类拥有各自的方法
- 再生成一个Grade类,类里包含一个randomStu方法,这个方法的作用:随机产生一个学生带领同学们上早自习,并返回随机结果(简单来说:随机结果为传参的类)
- 主函数里
- 创建Grade实例,调用其randomStu方法
- 判断Grade类里,随机返回的结果的类型是否是某一个子类类型,如果是,调用相应的方法
上代码:
import random
class Student(object):
def __init__(self, name):
self.name = name
def zaozixi(self):
print(f'今天带领上早自习的同学为:{self.name}')
class CStudent(Student):
def english(self):
print(f'{self.name}同学正在带领其他同学朗读古诗文......')
class MStudent(Student):
def sing(self):
print(f'{self.name}同学正在带领其他同学练声......')
class ZStudent(Student):
def run(self):
print(f'{self.name}同学正在带领其他同学跑步......')
class Grade(object):
def randomStu(self):
stu_list = [CStudent('陈哲'), MStudent('马启月'), ZStudent('郑佳雯')]
return random.choice(stu_list)
if __name__ == '__main__':
grade = Grade()
student = grade.randomStu()
student.zaozixi()
if isinstance(student, CStudent):
student.english()
elif isinstance(student, MStudent):
student.sing()
else:
student.run()
输出结果为:(每次都是随机的)
今天带领上早自习的同学为:马启月
马启月同学正在带领其他同学练声......
写的不好请谅解!



