1.继承的另一种使用方式   *****

最常见的是直接继承一个已经存在的类

当你想要创建一个新的类 发现这个类中的一些 在某一个类中已经存在

那就没有必要从头开始写 ,可以直接继承已有的类 然后做补充

注意注意::::::

class MyList(list):    def __init__(self,element_cls):        # 当你覆盖了init方法时        # 不要忘记调用super().init函数让父类完成原有的初始化操作        super().__init__()        self.element_cls = element_cls​

    def append(self, object):        # if isinstance(object,str)        if object.__class__ == self.element_cls:            super().append(object)        else:            print("只能存储%s类型!" % self.element_cls.__name__)            

2.super()的问题  mro列表

python支持多继承  一个类可以同时继承多个父类

好处是更加灵活

问题是:属性的查找顺序该怎么确定

# 问题:多继承时如果多个父类中出现了同名的属性/函数# 你不能用眼睛去判断查找顺序 ,需要使用mro列表来查看真正的继承顺序# 总结:super在访问父类属性时 是按照mro列表一层层往上找的​#测试class A:    def test(self):        print("from A")        super().test() # 应该报错..... 但是却执行成功了class B:    def test(self):        print("from B")    pass​class C(A,B):    pass​c = C()c.test()​#最后:尽量不要使用多继承

组合:

"""组合:指的是 一个类把另一个类的对象作为自己的属性 就称之为组合无处不在当你定义一个类 并且这个类拥有某种类型的属性时 就称之为组合​都是用用来重用代码的方式:组合描述的是 什么拥有什么的关系   学生 有 书 学生有手机基础描述的是 什么是什么的关系     麦兜是猪   猪猪侠也是猪"""​​# class Person:#     def __init__(self,name):#         self.name = name### p = Person("rose")# print(p.name)​​class PC:    def open_app(self,app_name):        print("open %s" % app_name)​class OldBoyStudent:    def __init__(self,PC,notebook):        self.PC = PC        self.notebook = notebook    pass​pc = PC()notebook = PC()​​stu = OldBoyStudent(pc,notebook)

3.菱形继承问题  ***

新式类与经典类

# 在py2中 A就是一个经典类# class A:#     pass​# 如果你的代码需要兼容py2 那应该显式的继承object 无论是直接还是间接继承class B(object):    pass​class A(B):    pass

多层菱形继承

class A:    # a = 1    pass​class B(A):    # a = 2    pass​class C(A):    # a = 3    pass​class D(A):    # a = 4    pass​class E(B,C,D):    # a = 5    pass​e1 = E()# print(e1.a)# 新式类的顺序# E B C D A object # 经典类的顺序# E B A C D# print(E.mro())​注意:经典类没有mro列表

4.接口 ***

接口是什么

例如USB

电脑内部具备USB相应的功能 如果要使用的话   就必须给外界提供一个使用方式,该方式就称之为接口 ,

在程序中功能通常是用函数来表示, 对于外界而言 无需清楚函数时如何实现的 只要知道函数名即可, 这个函数名称就可以称之为接口

外界调用接口就能完成某个任务

接口其实就是一组功能的定义,但是只清楚函数名称,而没有具体的实现细节

相当于是一套规范,

例如USB   规定了接口的外观,大小,以及每条线路的功能是什么

硬件开发商照着这个USB协议来生产设备,就可以被电脑使用

class USB:​    def open(self):        pass​    def close(self):        pass​    def work(self):        pass

好处:

使用接口可以提高程序的扩展性

只要对象按照接口规定方法来实现,使用者就可以无差别使用所有对象

接口与抽象类

抽象:

指的是 不清楚 不具体 看不懂

抽象方法:

指的是 没有函数体的方法   用@abc.abstractmethod 装饰器

如果类中具备抽象方法 那么这个类就称之为抽象类

抽象类的特点:

不能直接实例化  必须有子类覆盖了所有抽象方法后才能实例化子类

与接口的区别:

接口是指只有方法声明而没有实现体 ,  接口中所有方法都是抽象的

import abc​class Test(metaclass=abc.ABCMeta):​    @abc.abstractmethod    def say_hi(self):        pass​class TT(Test):​    def say_hi(self):        print("i am TT obj")​t = TT()t.say_hi()

问题:如果接口的子类没有实现接口中的方法,那是没有任何意义的

抽象类之所以出现的意义:通过抽象类来强行限制子类必须覆盖所有的抽象方法

鸭子类型

说如果一个对象叫声像鸭子,走路像鸭子,长得像鸭子,那它就是鸭子

是python 推荐的方式,python不喜欢强行限制你

​class PC():​    def conntent_device(self, usb_device):        usb_device.open()        usb_device.work()        usb_device.close()​class Mouse:    # 实现接口规定的所有功能    def open(self):        print("mouse opened")​    def work(self):        print("mouse working...")​    def close(self):        print("mouse closed")​mouse = Mouse()pc = PC()​pc.conntent_device(mouse)​​​class KeyBoard:    def open(self):        print("KeyBoard opened")​    def work(self):        print("KeyBoard working...")​    def close(self):        print("KeyBoard closed")​key1 = KeyBoard()​# 如果key1的特征和行为都像USB设备 那就把它当做USB设备来使用# 对于使用者而言可以不用关心这个对象是什么类,是如如何是实现,pc.conntent_device(key1)​

案例2:

class Linux:    def read_data(self,device):        data = device.read()        return data​    def write_data(self,device,data):        device.write(data)​class Disk:    def read(self):        print("disk reading....")        return "这是一个磁盘上的数据"​    def write(self,data):        print("disk writing %s..." % data)​class UP:    def read(self):        print("disk reading....")        return "这是一个U盘上的数据"​    def write(self,data):        print("disk writing %s..." % data)​​l = Linux()​d = Disk()data = l.read_data(d)l.write_data(d,"这是一个数据....")​​up1 = UP()l.read_data(up1)l.write_data(up1,"一个数据...")

例如linux 有一句话叫一切皆文件

之所以这么设计是为了提高扩展性,让Linux可以无差别对待任何设备!

今日的知识点:

1.继承的另一种使用方法

继承一个已经存在的类 并扩展新方法  或修改原来的方法

2.super() 是按照mro列表来查找属性的

3.组合  一个类把另一个类的对象作为属性

  1. 菱形继承的问题

    经典类:不是object的子类   仅在py2中出现

    深度优先

    新式类:object的子类 py3中都是新式类

    先深度 直到有一个公共父类时,查找其他路线(基于C3算法)

5.接口是一套协议规范,具体表现:一堆只有方法声明而没有实现体的方法

6.抽象类:具备抽象方法的类  抽象方法时没有实现体的方法   不能直接实例化  通过abc模块来实现

抽象类既可以以后抽象方法也可以有普通方法

而接口中全都是抽象方法

接口的出现是为了提高扩展性,抽象类是为类限制子类必须按照接口要求的来实现

鸭子类型

对于一个优秀的程序员,即时没有接口和抽象类的限制,也能写出一个具备扩展性的程序

就如何做到:鸭子类型

鸭子类型:这个对象 长的想鸭子 叫声像鸭子 走路像鸭子  那它就是鸭子

就可以把它当成鸭子来使用

转载于:https://www.cnblogs.com/haojunliancheng/p/10882002.html

第二十三章:面向对象(3)相关推荐

  1. 数字图像处理:第二十三章 基于内容的图象与视频检索

    第二十三章基于内容的图象与视频检索 目录 1.    引言 2.    基于内容检索的图象特征 3.    基于内容的视频标注与检索 作业 1. 引言 随着社会的信息化发展日益深入,互连网日益普及,越 ...

  2. 20190928 On Java8 第二十三章 注解

    第二十三章 注解 定义在 java.lang 包中的5种标准注解: @Override:表示当前的方法定义将覆盖基类的方法.如果你不小心拼写错误,或者方法签名被错误拼写的时候,编译器就会发出错误提示. ...

  3. 第二十三章 SQL函数 CAST(二)

    文章目录 第二十三章 SQL函数 CAST(二) 转换位值 示例 第二十三章 SQL函数 CAST(二) 转换位值 可以将expr值转换为BIT以返回0或1. 如果expr为1或任何其他非零数值,则返 ...

  4. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  5. 【正点原子Linux连载】第二十三章 音频应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    第二十三章 音频应用编程 ALPHA I.MX6U开发板支持音频,板上搭载了音频编解码芯片WM8960,支持播放以及录音功能! 本章我们来学习Linux下的音频应用编程,音频应用编程相比于前面几个章节 ...

  6. 《快速掌握PyQt5》第二十三章 主窗口QMainWindow

    第二十三章 主窗口QMainWindow 23.1 记事本应用 23.3 程序启动画面QSplashScreen 23.2 小结 <快速掌握PyQt5>专栏已整理成书出版,书名为<P ...

  7. 第二十三章 类关键字 - Language

    文章目录 第二十三章 类关键字 - Language 用法 详解 对子类的影响 默认 第二十三章 类关键字 - Language 指定用于实现此类方法的默认语言. 用法 若要指定用于实现此类中的方法的 ...

  8. 【信息系统项目管理师】第二十三章 信息系统综合测试与管理(考点汇总篇)

    [信息系统项目管理师]第二十三章 信息系统综合测试与管理(考点汇总篇) 考点分析与预测 本章内容属于第三版教材新增的内容,总共80多页,但在上午考试中只考2分.一般来说还会在案例分析中涉及一个关于测试 ...

  9. 系统集成项目管理工程师(软考中级)—— 第二十三章 风险管理 笔记分享

    前言 现在分享一些笔记给大家,希望能够帮助大家并顺利通过软考. 幕布地址:第二十三章 风险管理 - 幕布 概述 大数据 ITO 4W1H 风险 概念 风险是一种不确定的事件或条件,一旦发生,就会产生积 ...

最新文章

  1. Linux网络编程--TCP中的三次握手和四次挥手
  2. Keras输出网络结构图
  3. 用上Pytorch Lightning的这六招,深度学习pipeline提速10倍!
  4. 干货 | 请收下这份2018学习清单:150个最好的机器学习,NLP和Python教程
  5. Mahout学习路线图
  6. 【solr专题之三】Solr常见异常
  7. 学习使用资源文件[2] - Ico
  8. 农广传媒获中体基金2000万元Pre-A轮融资
  9. Python搭建BT资源搜索站
  10. Cloudera Manager集群报警,堆转储目录/tmp 或日志目录/var/log 可用空间小于 5.0 吉字节
  11. 手把手教你如何使用Unity搭建简易图片服务器
  12. 单片机常用芯片总结(一)——LCD1602液晶屏
  13. 英文版xp系统下载ghost xp sp3英文版(双语纯净版、可随意转换)
  14. 余三码的优点及其与8421码的对比
  15. apache的HttpClient的默认重试机制
  16. 2019C语言课程设计
  17. AI行业强者愈强?Tesra超算网络助力中小AI开发企业!
  18. Linux操作系统下的串口通信
  19. SER5 5500U 黑苹果系统安装教程
  20. 11.18XML与JSON的简介

热门文章

  1. 征途2经典版服务器双线哪个稳定,征途,别毁了自己和曾经的经典
  2. 使用Goods类创建十个商品 第四章 面向对象(上)课堂作业2
  3. 简单地人物介绍页面设计
  4. 华为手机计算机的隐藏游戏,怎样把华为手机游戏隐藏起来 | 手游网游页游攻略大全...
  5. 量化投资之宏观篇 | 达里欧谈美国社会的矛盾及如何改良
  6. 非常详细的Series核心操作使用详解
  7. 12306 售票网站新版验证码识别对抗
  8. 物联网应用入门--利用虚拟硬件模拟土壤湿度传感器应用编写
  9. 利用色光三原色调整图片颜色
  10. 俄罗斯方块 UWP 版