您的“关注”和“点赞”,是信任,是认可,是支持,是动力…
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
面向对象编程语言三大特性,如下所示,
- 封装:请参见博文《Python 封装详解》。
- 继承:请参见博文《Python 继承详解》。
- 多态:请参见本文。
1 多态概述
多态指的是:相同类型的变量调用同一个方法时呈现出的多种不同的行为特征。
类的多态特性,要满足以下两个前提条件,
- 继承:多态一定是发生在子类和父类之间;
- 重写:子类重写了父类的方法。
举例如下所示:
class People:
def say(self):
print('People 父类中的 say() 方法。')
# 定义一个 Person 子类,继承 People 类
class Men(People):
def say(self):
print('Men 子类中重写父类的 say() 方法:声音比较粗狂。')
# 定义一个 Women 子类,继承 People 类
class Women(People):
def say(self):
print('Women 子类中重写父类的 say() 方法:声音比较细腻。')
people = People() # 实例化父类
print('判断 people 变量是否是 People 类型:', isinstance(people, People))
print('---------------------------------------------------------------')
men = Men() # 实例化 Men 子类
print('判断 men 变量是否是 Men 类型:', isinstance(men, Men))
print('判断 men 变量是否是 People 类型:', isinstance(men, People)) # 从结果可以看出,men 变量不仅是 Men 类型,而且是 People 类型。
print('----------------------------------------------------------------')
women = Women() # 实例化 Women 子类
print('判断 women 变量是否是 Men 类型:', isinstance(women, Women))
print('判断 women 变量是否是 People 类型:', isinstance(women, People)) # 从结果可以看出,men 变量不仅是 Men 类型,而且是 People 类型。
print('----------------------------------------------------------------')
# 继承,并重写父类中的 say() 方法。
# 相同类型的变量(people、men、women)调用同一个方法(say() 方法)时呈现出的多种不同的行为特征(每个子类重写后的行为特征),这就是多态。
people.say() # people 变量是 People 类型
men.say() # men 变量是 Men 类型,同样也是 People 类型
women.say() # women 变量是 Women 类型,同样也是 People 类型
运行结果:
判断 people 变量是否是 People 类型: True
---------------------------------------------------------------
判断 men 变量是否是 Men 类型: True
判断 men 变量是否是 People 类型: True
----------------------------------------------------------------
判断 women 变量是否是 Men 类型: True
判断 women 变量是否是 People 类型: True
----------------------------------------------------------------
People 父类中的 say() 方法。
Men 子类中重写父类的 say() 方法:声音比较粗狂。
Women 子类中重写父类的 say() 方法:声音比较细腻。
从上面的例子来看,Men 类和 Women 类都继承自 People 类,且各自都重写了父类的 say() 方法。
从运行结果可以看出,同一类型的变量(people、men 和 women 变量都是 People 类型)在执行同一个 say() 方法时,由于实际表示不同的类实例对象,因此调用的 say() 方法并不是同一个类中的 say() 方法,将会呈现出多种不同的行为特征(每个子类重写后的行为特征),这就是多态。
2 Python “鸭子模型”
“鸭子模型”,或称为“鸭子类型”。
“鸭子类型”,请参见博文《“鸭子类型”详解》。更新中 …
Python “鸭子模型”,是 Python 在多态的基础上衍生出的一种更加灵活的编程机制。
举例如下所示:
class People:
def say(self):
print('People 父类中的 say() 方法。')
# 定义一个 Person 子类,继承 People 类
class Men(People):
def say(self):
print('Men 子类中重写父类的 say() 方法:声音比较粗狂。')
# 定义一个 Women 子类,继承 People 类
class Women(People):
def say(self):
print('Women 子类中重写父类的 say() 方法:声音比较细腻。')
# 定义一个 Test 类
class Test:
def say(self, arg):
arg.say()
people = People() # 实例化 People 类
men = Men() # 实例化 Men 类
women = Women() # 实例化 Women 类
test = Test() # 实例化 Test 类
# 形式上仅调用 Test 类的 say(arg)方法;实际上传入不同的实例对象,会调用各个实例对象的 say() 方法。
test.say(people)
test.say(men)
test.say(women)
运行结果:
People 父类中的 say() 方法。
Men 子类中重写父类的 say() 方法:声音比较粗狂。
Women 子类中重写父类的 say() 方法:声音比较细腻。
【友情链接】
微信公众号:码农阿杰
博客园
【参考资料】
Python 官网
Python 3.8.2 documentation
转载:https://blog.csdn.net/manongajie/article/details/105934573
查看评论