文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python 面向对象之多态

2023-01-30 21:59

关注

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。


简单来说:一种接口,多种实现。

多态的主要作用是实现接口的重用


举例:

class Animal(object): #动物
    def __init__(self, name):  # 构造函数
        self.name = name

    def talk(self):  #说话
        pass


class Cat(Animal): #猫
    def talk(self): #说话
        print('%s: 喵喵喵!' % self.name)


class Dog(Animal): #狗
    def talk(self):
        print('%s: 汪!汪!汪!' % self.name)

正常情况下,实例化对象

d = Dog("花花")
d.talk()

c = Cat("雪儿")
c.talk()

执行输出:

花花: 汪!汪!汪!

雪儿: 喵喵喵!


上面的方法,必须先知道它是什么动物,才能让它叫


能不能同一个接口,比如animal.talk(),可以让所有的动物都叫

如何实现呢?

定义一个函数,完整代码如下:

#!/usr/bin/env python
# coding: utf-8
__author__ = 'www.py3study.com'

class Animal(object): #动物
    def __init__(self, name):  # 构造函数
        self.name = name

    def talk(self):  #说话
        pass

class Cat(Animal): #猫
    def talk(self): #说话
        print('%s: 喵喵喵!' % self.name)

class Dog(Animal): #狗
    def talk(self):
        print('%s: 汪!汪!汪!' % self.name)

def animal_talk(obj): #一个接口,多种形态
    obj.talk()

d = Dog("花花") #实例化对象
c = Cat("雪儿")

animal_talk(d) #执行函数,传一个对象
animal_talk(c)

执行输出:

花花: 汪!汪!汪!

雪儿: 喵喵喵!


这样执行,看不出啥效果,但问题在于,现在相当于有一个统一接口了

可以传入任意对象,根据对象的不通,实现不同的状态。

这种就是一种接口,多种实现

具体怎么实现,是在子类里面定义的。

这还不是真正意义的多态。


将这个接口,移植到父类里面

#!/usr/bin/env python
# coding: utf-8
__author__ = 'www.py3study.com'

class Animal(object): #动物
    def __init__(self, name):  # 构造函数
        self.name = name

    def talk(self):  #说话
        pass

    @staticmethod #静态方法,需要通过类名来调用这个方法
    def animal_talk(obj):  # 统一接口
        obj.talk()

class Cat(Animal): #猫
    def talk(self): #说话
        print('%s: 喵喵喵!' % self.name)

class Dog(Animal): #狗
    def talk(self):
        print('%s: 汪!汪!汪!' % self.name)


d = Dog("花花") #实例化对象
c = Cat("雪儿")

Animal.animal_talk(d) #执行方法,传一个对象
Animal.animal_talk(c)

执行输出:

花花: 汪!汪!汪!

雪儿: 喵喵喵!


调用同一的接口,实现不同的状态,这就是多态(一种接口,多种实现)

这种场景,主要用在接口重用

就像统一的接口


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯