数据结构与算法:python语言描述学习笔记Part2

第二章:抽象数据类型和python

2.1 抽象数据类型

抽象数据类型(Abstract Data TypeADT)是一种思想和方法,用于设计和实现程序模块,ADT的基本思想是抽象

抽象的思想:

计算层面的抽象:

包括接口和实现

设计者应该通过一套接口来给出程序的可用功能,接口包括函数名字和对参数的要求,功能可以随意实现;使用者使用时,只需要看接口是否满足需要,保证调用时符合函数头部的要求,不需要知道功能实现任何细节

数据层面的抽象

能围绕一类数据类型建立程序组件,将该类数据的具体表示和相关操作的实现包装成一个整体

同样包括接口和实现

模块接口提供使用它功能的所需信息,不涉及任何细节;模块的实现者要通过模块内部的一套数据定义和函数定义,实现接口的所有功能

ADT的实现:

将数据和操作隔离开

把数据定义为抽象对象的集合,只为它们定义可用的合法操作,不暴露内部的细节,基本操作包括:

构造操作:基于已知的信息,产生出这种类型的一个新对象

解析操作:从一个对象取得有用的信息,其结果反映了被操作对象某方面的特性,但结果不是本类型的对象

变动操作:修改被操作对象的内部状态

ADT的描述:

一个ADT描述由一个头部和按一定格式给出的一组操作描述构成

ADT的头部给出类型名,最前面写关键词‘ADT’

操作的形式描述给出操作的名字、参数的类型和参数名

各操作的实际功能用自然语言描述

2.2 Python类与对象

python中利用类定义来实现ADT,类定义机制用于定义程序里需要的类型

类的定义说明:

类中的方法的第一个参数总是self,表示实际使用时调用的对象

类中定义的名字(数据属性或函数属性名),作用域不会延伸到类的内部嵌套作用域,所以想在类中的函数定义里应用这个类的属性,一定要采用基于类名的属性引用方式,即Class.name,而不能直接name

由下划线_开头的属性名和函数名都当做内部使用的名字,不能在类之外使用

由两个下划线开头,但不由两个下划线结束,无法在类之外采用属性访问这个名字的方式找到

由两个下划线开头,两个下划线结束的是特殊名字,比如python为所有运算符都定义了特殊方法名

__str__:在类中定义一个把该类的对象转换到字符串的方法

__doc__:该类的文档串

- : __sub__

+ : __add__

* : __mul__

/ : __truediv__

% : __mod__

类中的方法分为对象方法、静态方法、类方法

区别:

对象方法不能通过类名调用,其他两个可以

静态方法:

什么时候用:

该方法不依赖任何对象

该方法是类的实现时需要的一种辅助功能,即,它是一个局部的功能

好处:不需要实例即可使用该方法,即,这个方法不需要依赖对象本身就可以用。而且多个实例共享此静态方法

静态方法描述时需要最前面写一行@staticmethod

静态方法参数表中没有self参数,于是静态方法不会自动使用self参数,导致了静态方法不能访问类变量和实例变量,所以参数表里必须为每个形参提供实参

类方法:

类方法描述时需要最前面写一行@classmethod

类方法的第一个参数都是类对象cls而不是实例对象

类方法执行时,调用该方法的类,将自动约束到类方法的cls参数,可以通过这个参数访问类的其他属性

通常用类方法实现与本类的所有对象相关的操作

类对象支持的操作:

属性访问:.

实例化:创建这个类的实例对象

实例对象:

初始化:在创建类的实例对象时自动完成适当的初始化:__init__

类中的__init__方法用于构造本类的新对象

__init__方法的self参数总表示当前正在创建的对象

用类中的除了__init___的其他函数查看或修改实例对象的状态

使用:

C中有方法函数m和实例对象oo要用C中的mpython就会创建一个方法对象,把om约束到这个方法对象中,后面用到这个方法对象时,o就会成为m的第一个实参,在m的定义中通过self访问,实现o的属性访问

继承:

基于类和对象的程序设计(面向对象的程序设计)的基本工作:

定义程序需要的类

创建这些类的对象(实例)

调用对象的方法完成计算,包括对象间的信息交换

作用:

基于已有类定义新类,通过继承来复用已有类的功能

建立一组类之间的继承关系

如果一个类定义中美说明基类,那么该类就自动以object类作为基类;即任何类都是object的直接或间接派生类

派生类:通过继承定义出的新类

需要重新定义__init__函数,完成该类实例的初始化

派生类的实例对象里包含基类实例的所有数据属性,在创建派生类的对象时,需要对基类对象的所有数据属性进行初始化

直接调用基类的__init__方法,利用它为正创建的实例中那些在基类实例中也有的数据属性设置初值,它完成派生类实例中基类的那部分属性的初始化工作

class DerivedClass(Baseclass):

    def __init__(self, …):

        Baseclass.__init__(self, …)

        …

super():用在派生类的方法定义中,这个函数要求从这个类的基类开始做属性检索,而不是从这个类本身开始查找

猜你喜欢

转载自blog.csdn.net/dmbjzhh/article/details/79438904
今日推荐