文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

继承和多态

2023-01-31 00:49

关注

在OOP程序设计中,当定义一个class的时候,可从某个现有的class继承
新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)
格式:

  class 子类名(父类名):
    pass

 

使用示例

class Animal(object):
    def run(self):
        print('Animal is running...')
    
class Dog(Animal):
    pass
    
class Dog1(Animal):
    def run(self):
        print('Dog is running...')
        
def run_twice(animal):  
    animal.run()  
    animal.run()
        
dog = Dog()
dog.run()    #输出:Animal is running...

dog1 = Dog1()
dog1.run()    #输出:Dog is running...,执行子类自己的方法

run_twice(Animal())
#输出:Animal is running...
#输出:Animal is running...

run_twice(Dog1())
#输出:Dog is running...
#输出:Dog is running...

#新追加一个子类型Tortoise,然后调用run_twice函数,依然可以运行
class Tortoise(Animal):   
    def run(self):
        print('Tortoise is running slowly...')    
        
run_twice(Tortoise())   #调用run_twice函数,依然可以运行,确保传入的对象有run()方法即可
#输出:Tortoise is running slowly...
#输出:Tortoise is running slowly...

 

 

数据类型判断
  定义一个class实际上就是定义一种数据类型,该数据类型和Python自带的数据类型,比如str、list、dict完全一样
  判断一个变量是否是某个类型可以用isinstance()判断
  对于isinstance(a, A),则
    如果a是A类对象,返回true
    如果a是A类子类对象,返回true
    其他都返回false

 

关于继承
  1) 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写
   子类通过继承获得了所有父类的方法(包括__init__方法,如果父类的该方法有参数,则子类创建实例时也要传参数)
  2) 当子类和父类都存在相同的方法时,子类覆盖了父类的该方法,运行时,总是会调用子类方法,这就是就是多态
  3) 继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系
    而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树


关于多态
  调用方只管调用,不管细节,而当新增一种子类时,只要确保方法编写正确,不用管原来的代码是如何调用的
  说白了,就是不管怎么追加子类,也不需要修改原来的代码
  这就是著名的"开闭"原则:
    对扩展开放:允许子类重写方法函数
    对修改封闭:不重写,直接继承父类方法函数

 

静态语言和动态语言
  如果一个方法,要传入的参数是A类对象,方法内部需要调用该参数的run()方法,则:
    对于Java这样的动态语言,则一定要传入A类或者其子类对象,否则将无法调用方法
    对于Python这样的动态语言,则不一定要传入A类或其子类对象,只需保证传入的对象有一个run()方法即可

  这就是动态语言的"鸭子类型",它并不要求严格的继承体系,一个对象只要"看起来像鸭子,走起路来像鸭子",那它就可以被看做是鸭子

  关于file-like object
    Python的"file-like object"就是一种鸭子类型
    真正的文件对象都有一个read()方法,但许多对象,只要有read()方法,都被视为"file-like object"
    许多函数接收的参数就是"file-like object",不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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