飞道的博客

Python 多态详解 [OOP][“鸭子类型”]

437人阅读  评论(0)

您的“关注”和“点赞”,是信任,是认可,是支持,是动力…

如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。


面向对象编程语言三大特性,如下所示,

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场