数据结构( Pyhon 语言描述 ) — — 第6章:继承和抽象类
- 继承
- 新的类通过继承可以获得已有类的所有特性和行为
- 继承允许两个类(子类和超类)之间共享数据和方法
- 可以复用已有的代码,从而消除冗余性
- 使得软件系统的维护和验证变得简单
- 子类通过修改自己的方法或者添加新的方法,从而将超类的行为特殊化
- 子类可以调用超类的方法,需要使用超类的名称作为该方法的前缀
- 使用继承定制一个已有的类
- 已有类的子类化
- 子类和超类(父类)的继承关系

- 由于 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章:继承和抽象类的更多相关文章
- 数据结构( Pyhon 语言描述 ) — —第10章:树
树的概览 树是层级式的集合 树中最顶端的节点叫做根 个或多个后继(子节点). 没有子节点的节点叫做叶子节点 拥有子节点的节点叫做内部节点 ,其子节点位于层级1,依次类推.一个空树的层级为 -1 树的术 ...
- 数据结构( Pyhon 语言描述 ) — —第9章:列表
概念 列表是一个线性的集合,允许用户在任意位置插入.删除.访问和替换元素 使用列表 基于索引的操作 基本操作 数组与列表的区别 数组是一种具体的数据结构,拥有基于单个的物理内存块的一种特定的,不变的实 ...
- 数据结构( Pyhon 语言描述 ) — — 第5章:接口、实现和多态
接口 接口是软件资源用户可用的一组操作 接口中的内容是函数头和方法头,以及它们的文档 设计良好的软件系统会将接口与其实现分隔开来 多态 多态是在两个或多个类的实现中使用相同的运算符号.函数名或方法.多 ...
- 数据结构( Pyhon 语言描述 ) — — 第7章:栈
栈概览 栈是线性集合,遵从后进先出原则( Last - in first - out , LIFO )原则 栈常用的操作包括压入( push ) 和弹出( pop ) 栈的应用 将中缀表达式转换为后缀 ...
- 数据结构( Pyhon 语言描述 ) — — 第2章:集合概览
集合类型 定义 个或多个其他对象的对象.集合拥有访问对象.插入对象.删除对象.确定集合大小以及遍历或访问集合的对象的操作 分类 根据组织方式进行 线性集合 线性集合按照位置排列其项,除了第一项,每一项 ...
- 数据结构( Pyhon 语言描述 ) — — 第4章:数据和链表结构
数据结构是表示一个集合中包含的数据的一个对象 数组数据结构 数组是一个数据结构 支持按照位置对某一项的随机访问,且这种访问的时间是常数 在创建数组时,给定了用于存储数据的位置的一个数目,并且数组的长度 ...
- 数据结构( Pyhon 语言描述 ) — —第11章:集和字典
使用集 集是没有特定顺序的项的一个集合,集中的项中唯一的 集上可以执行的操作 返回集中项的数目 测试集是否为空 向集中添加一项 从集中删除一项 测试给定的项是否在集中 获取两个集的并集 获取两个集的交 ...
- 数据结构( Pyhon 语言描述 ) — — 第1章:Python编程基础
变量和赋值语句 在同一条赋值语句中可以引入多个变量 交换变量a 和b 的值 a,b = b,a Python换行可以使用转义字符\,下一行的缩进量相同 )\ 帮助文档 help() 控制语句 条件式语 ...
- 数据结构( Pyhon 语言描述 ) — — 第8章:队列
队列概览 队列是线性的集合 队列的插入限制在队尾,删除限制在队头.支持先进先出协议( FIFIO, first-in first-out ) 两个基本操作 add:在队尾添加一项 pop:从队头弹出一 ...
随机推荐
- hashlib 实现加密
实现代码 import hashlib # hashlib是一个python用于给数据加密的包,内有很多加密方式,包括md5,sha1, sha224, sha256, sha384, sha512等 ...
- 2个sql 函数dbms_lob.substr 和 wm_concat
转自: http://blog.csdn.net/wenzhongyan/article/details/50315473 http://blog.csdn.net/ojerryzuo/article ...
- 自己项目中PHP常用工具类大全分享
<?php /** * 助手类 * @author www.shouce.ren * */ class Helper { /** * 判断当前服务器系统 * @return string */ ...
- ECSHOP商品属性调用到任意页面方法
看到标题有的人觉得这个很复杂,其实这个没那么复杂,直接用下面的方法,就可以在ECSHOP的任意页面调用商品属性. 一)打开includes\lib_insert.php文件,在最后面增加一个函数: f ...
- Spring之WebContext不使用web.xml启动 初始化重要的类源码分析(Servlet3.0以上的)
入口: org.springframework.web.SpringServletContainerInitializer implements ServletContainerInitializer ...
- github入门一
一.首先安装gitbash(自行百度)我使用的版本是Git-2.12.2.2-64-bit.exe 二.配置gitbash本地客户端 1.初始设置 1.1.设置姓名和邮箱地址 git config - ...
- UVa 12219 Common Subexpression Elimination (stl,模拟,实现)
一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理 直接map离散.当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000. ...
- elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解
一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...
- 中国剩余定理&Lucas定理&按位与——hdu 5446
链接: hdu 5446 http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意: 给你三个数$n, m, k$ 第二行是$k$个数,$p_1,p_2,p_ ...
- winform中让显示的图片覆盖到父窗体保持父窗体的不可选中的状态,且任务栏中不会显示子窗体的任务选项
要求:为父窗体添加一个类似于加载等待的功能,当窗体点击备份时弹出且覆盖掉窗体 问题一产生:当为弹窗添加控件时,form.show();导致窗体卡死,控件变得透明化; 问题一分析:当窗体show();之 ...