• 继承
        • 新的类通过继承可以获得已有类的所有特性和行为
          • 继承允许两个类(子类和超类)之间共享数据和方法
          • 可以复用已有的代码,从而消除冗余性
          • 使得软件系统的维护和验证变得简单
          • 子类通过修改自己的方法或者添加新的方法,从而将超类的行为特殊化
          • 子类可以调用超类的方法,需要使用超类的名称作为该方法的前缀
      • 使用继承定制一个已有的类
        • 已有类的子类化
          • 子类和超类(父类)的继承关系
            • 由于 ArrayBag 类实现了 BagInterface,所以 ArraySortedBag 也通过继承实现了这个接口
          • 创建已有类的一个子类的步骤
            • 为了保证能够实现继承,必须将父类名称放在类声明头部的圆括号中
            • 修改必须修改的方法的代码(包括 __init__ 方法)
            • 添加新的方法
        • __init__ 方法
          • 在子类中调用父类的方法
            • <parent class name>.<method name>( self, <other arguments> )
            • 示例
              • """

                File: arraysortedbag.py

                """

                from arraybag import ArrayBag

                class ArraySortedBag( ArrayBag ):

                """An array-based sorted bag implementation."""

                #Constructor

                def __init__( self, sourceCollection = None ):

                """Sets the initial state of self, which includes the contents

                of sourceCollection, if it's present."""

                ArrayBag.__init__( self, sourceCollection )

        • 添加新的 contains 方法
          • 在有序包上执行二叉搜索
            • #!/usr/bin/env python

              # -*- coding:utf-8 -*-

              # Author:Lijunjie

              """

              File: arraysortedbag.py

              """

              from arraybag import ArrayBag

              class ArraySortedBag( ArrayBag ):

              """An array-based sorted bag implementation."""

              #Constructor

              def __init__( self, sourceCollection = None ):

              """Sets the initial state of self, which includes the contents

              of sourceCollection, if it's present."""

              ArrayBag.__init__( self, sourceCollection )

              #Accessor method

              def __contains__( self, item ):

              """Return True if item is in self, or False otherwise"""

              while left <= right:

              if self._items[midpoint] == item :

              return True

              if self._items[midpoint] > item :

              else:

              return False

        • 修改已有的 add 方法
          • 代码
            • #Mutator method

              def add( self, item ):

              """Adds item to self."""

              #Empty or last item, call ArrayBag.add

              ]:

              ArrayBag.add( self, item )

              else:

              #Resize the array if it is full here

              #Search for the first item > = new item

              while item > self._items[targetIndex]:

              #open a hole for a newitem

              for index in range( len( self ), targetIndex, -1 ):

              ]

              #insert item and update size

              self._items[targetIndex] = item

        • ArraySortedBag的运行时间性能
          • ArraySortedBag将__contains__方法的时间复杂度从 降为(logn),从而优化了其它借助于 __contains__方法的方法,即 in 运算符。比如 __eq__ 方法。
        • Python中的类层级
          • Python 所有的内建的类都位于一个层级中,这个层级的最项端或根部的是 object 类。
          • Python支持对多个父类的子类化和继承
      • 使用抽象类去除代码的冗余性
        • 抽象类
          • 抽象类是一种超类
          • 它捕获了相关一组类的通用特征和行为,从而可以去除已知类中冗余的方法和数据
          • 抽象类不能正常的实例化,它的子类叫做具体类
        • 设计一个 AbstractBag 类
          • 冗余的方法
            • 最显而易见的冗余的方法是直接调用其他方法,并且没有直接访问实例变量的那些方法
          • 冗余的变量
            • 要找出冗余,必须查看该变量引用的是何种数据类型
          • 抽象类的框架
            • AbstractBag 类并没有实现包接口
            • 通常,一个类的方法和变量对其所有子孙类都是通用的
        • 重写 AbstractBag 中的 __init__ 方法
          • 代码
            • """

              File: abstractbag.py

              Author: Lijunjie

              """

              class AbstractBag( object ):

              """An abstract bag implementation."""

              #Constructor

              def __init__( self, sourceCollection = None ):

              """Sets the initial state of self, which includes the contents

              of sourceCollection, if it's present."""

              if sourceCollection:

              for item in sourceCollection:

              self.add( item )

        • 修改 AbstractBag 的子类
          • """

            File: arraybag.py

            Author: Lijunjie

            """

            from arrays import Array

            from abstractbag import AbstractBag

            class ArrayBag( AbstractBag ):

            """An array-based bag implementation."""

            #Class variable

            #Constructor

            def __init__( self, sourceCollection = None ):

            """Sets the initial state of self, which includes the contents

            of sourceCollection, if it's present."""

            self._items = Array( ArrayBag.DEFAULT_CAPACTIY )

            AbstractBag.__init__( self, sourceCollection )

        • 将 AbstractBag 中的 __add__ 方法泛化
          • 使用 type 函数来获取 self 的类型
          • 代码
            • def __add__( self, other ):

              """Return a new bag containing the contents of self and other"""

              result = type( self )( self )

              for item in other:

              result.add( item )

              return result

      • 所有集合的一个抽象类
        • 开发适用于整个集合层级的基础类
        • 将 AbstractCollection 整合到集合层级中
          • 最通用的方法: isEmpty、 __len__ 和 __add__。表示它们的实现不需要由子类来修改
          • AbstrcatCollection 中还可以定义 __str__ 和 __eq__ 的默认实现
          • 集合框架
            • 层级从上到下,类在特征上从较为通用倾向于更为具体
        • 在__eq__方法中使用两个迭代类
          • next 函数
            • 当在一个迭代器对象上调用 next 函数时,其会返回迭代器序列中的当前项,并且会前进一步到下一项。如果没有当前项,会抛出 StopIteration 异常
          • __eq__方法代码
            • def __eq__( self, other ):

              """Return True if self equals other, otherwise False."""

              if self is other: return True

              if type( self ) != type( other ) or len( self ) != len( other ):

              return False

              otherIter = iter( other )

              for item in self:

              if item != next( otherIter ):

              return False

              return True

数据结构( Pyhon 语言描述 ) — — 第6章:继承和抽象类的更多相关文章

  1. 数据结构( Pyhon 语言描述 ) — —第10章:树

    树的概览 树是层级式的集合 树中最顶端的节点叫做根 个或多个后继(子节点). 没有子节点的节点叫做叶子节点 拥有子节点的节点叫做内部节点 ,其子节点位于层级1,依次类推.一个空树的层级为 -1 树的术 ...

  2. 数据结构( Pyhon 语言描述 ) — —第9章:列表

    概念 列表是一个线性的集合,允许用户在任意位置插入.删除.访问和替换元素 使用列表 基于索引的操作 基本操作 数组与列表的区别 数组是一种具体的数据结构,拥有基于单个的物理内存块的一种特定的,不变的实 ...

  3. 数据结构( Pyhon 语言描述 ) — — 第5章:接口、实现和多态

    接口 接口是软件资源用户可用的一组操作 接口中的内容是函数头和方法头,以及它们的文档 设计良好的软件系统会将接口与其实现分隔开来 多态 多态是在两个或多个类的实现中使用相同的运算符号.函数名或方法.多 ...

  4. 数据结构( Pyhon 语言描述 ) — — 第7章:栈

    栈概览 栈是线性集合,遵从后进先出原则( Last - in first - out , LIFO )原则 栈常用的操作包括压入( push ) 和弹出( pop ) 栈的应用 将中缀表达式转换为后缀 ...

  5. 数据结构( Pyhon 语言描述 ) — — 第2章:集合概览

    集合类型 定义 个或多个其他对象的对象.集合拥有访问对象.插入对象.删除对象.确定集合大小以及遍历或访问集合的对象的操作 分类 根据组织方式进行 线性集合 线性集合按照位置排列其项,除了第一项,每一项 ...

  6. 数据结构( Pyhon 语言描述 ) — — 第4章:数据和链表结构

    数据结构是表示一个集合中包含的数据的一个对象 数组数据结构 数组是一个数据结构 支持按照位置对某一项的随机访问,且这种访问的时间是常数 在创建数组时,给定了用于存储数据的位置的一个数目,并且数组的长度 ...

  7. 数据结构( Pyhon 语言描述 ) — —第11章:集和字典

    使用集 集是没有特定顺序的项的一个集合,集中的项中唯一的 集上可以执行的操作 返回集中项的数目 测试集是否为空 向集中添加一项 从集中删除一项 测试给定的项是否在集中 获取两个集的并集 获取两个集的交 ...

  8. 数据结构( Pyhon 语言描述 ) — — 第1章:Python编程基础

    变量和赋值语句 在同一条赋值语句中可以引入多个变量 交换变量a 和b 的值 a,b = b,a Python换行可以使用转义字符\,下一行的缩进量相同 )\ 帮助文档 help() 控制语句 条件式语 ...

  9. 数据结构( Pyhon 语言描述 ) — — 第8章:队列

    队列概览 队列是线性的集合 队列的插入限制在队尾,删除限制在队头.支持先进先出协议( FIFIO, first-in first-out ) 两个基本操作 add:在队尾添加一项 pop:从队头弹出一 ...

随机推荐

  1. VLAN-5-802.1Q-in-Q隧道

    Q-in-Q允许SP在跨越WAN服务时,保留802.1Q VLAN标签.由此,VLAN可以被拓展到多个地理分散的站点上.     入向SP交换机收到802.1Q数据帧,使用额外的802.1Q头部来标记 ...

  2. django_logging

    django使用python自带的logging打印日志 logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志输出 ...

  3. Tinghua Data Mining

    Learning Resources 书籍: 期刊: 业界先驱: 开阔视野,掌握业界最新动态. 工具: 数据挖掘是很多学科的综合体: 甭管叫什么名字,归根到底都是数据挖掘: Comprehensive ...

  4. rtos概要

    一 RTOS如何调试: 静态调试帮不上忙,因为嵌入式系统都是动态系统 ,要借助基于RTOS系统的可视化分析 :Micriµm 的 µC/Probe ,SEGGER 的 SystemView ,Perc ...

  5. json_encode 中文处理

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它. 这个函数的功能是将数值转换成json数据存储格式. ...

  6. Y2分班考试 笔试题总结

    1. 此题编译错误  base无法点出methodB()方法 2. 第二题选C 3.此题选D:正确的输出级别为fatal>error>warn>info>debug 4. 此题 ...

  7. pay-spring-boot 开箱即用的Java支付模块,整合支付宝支付、微信支付

    关于 使用本模块,可轻松实现支付宝支付.微信支付对接,从而专注于业务,无需关心第三方逻辑. 模块完全独立,无支付宝.微信SDK依赖. 基于Spring Boot. 依赖Redis. 我能做什么 支付宝 ...

  8. 12.JAVA-基本数据类型的包装类操作

    1.基本数据类型的包装类 java是一个面向对象编程语言,也就是说一切操作都要用对象的形式进行.但是有个矛盾: 基本数据类型(char,int,double等)不具备对象特性(不携带属性和方法) 这样 ...

  9. 5、两个栈实现队列------------>剑指offer系列

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 栈1: 用于入队列存储 栈2: 出队列时将栈1的数据依次出栈,并入栈到栈2中 栈2出栈即栈1的底部数据 ...

  10. ES-windos环境搭建(2)

    下载 打开elasticsearch官网.选择downloads. 选择elasticsearch,并单击Download. 这里我们不选择最新版,而是选择靠前的版本,下拉选择past release ...