1.1 抽象数据类型是什么?
在程序的开发实践中,人们发现,仅有程序语法方面的抽象还远远不够,还需要考虑数据层面的抽象。从使用者的角度:抽象数据类型就是程序实现的一个功能部件,这个部件在头部定义了它的接口。不要求你知道它的内部细节。
1.1.1 抽象数据类型的分类
在每种编程语言中都有其内置的数据类型,比如①python中就有bool,int,float.str等单一的数据类型,②list,tulpe,dict等组合数据类型。但是,在真正的程序实践中,这些是不够的,我们还可以③自定义一些抽象的数据类型。1.1.2 抽象数据类型的具体内容
抽象的宗旨就是把使用与细节分开,只要属于这种类型,就可以抽象化某种动作。比如+,-,.的运算。一个抽象的数据类型应该有三种基本操作:1.构造操作:就是基于已有的变量通过已有的语法构造新的变量值。2.解析操作:比如从输入对象取小数部分出来 就是一个解析操作 。3.变动操作:就是修改数据,在创建该类型对象之后是否允许变动。基于这个可以把数据分为可变数据类型与不可变数据类型。
这个就是一个具体数据类型的具体内容:
有着与Python一样的结构,第一行就是定义新的数据类型“有理数类型”第二行是三种操作中的构造操作:由已知的数据类型构造出新的数据类型Rational(),第三行到第六行的运算构造,第七第八行是典型的解析操作,取得已有对象的新成分。
2.2 Python的类
上面讲了抽象数据类型的基本要素,如果要自行定义,比如在python里我们就要学习class面向对象的类的定义方法了。
类的基本语法:
class <类的名字>:
方法体
通过一个实例:
# 定义类:
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
# 创建实例:
my_dog = Dog('willie', 6)
解释:
1.类里面的所有陈述都是以函数的来表现的,但是在类里面的函数不叫函数,叫方法。
2.我们注意到几乎每个类都会定义__init__(self,...) 这个方法称作是 初始化方法,它的作用是,通过已有的传入参数构造新的对象,用self.name = 变量 的形式。这种形式可以在类的实例当中供实例直接句点调用。像这样可通过实例访问的变量称为属性。注意:属性的赋值有两种方法,①参数传入②常数赋值。
3.self必须存在,只有它才可以把实例传给所有的方法,只有传给了所有的方法,才有了 实例.方法()的引用方式。
4.在基于类创建实例时,我们以 实例 = 类名 + __init __行的(参数1,参数2)注意:self''不写'',自动传递。
5.类的定义可以放在主程序里面,也可以单独成立.py文件。在实际工程中,往往就是单独成立文件,用import导入 主程序应用。
6.类里面的私有变量(只允许在类的内部访问的变量):1.__变量名 2.__init__,__add__等都是python自带的函数名或变量名。
2.3 python类的继承
父类(基类)与子类(派生类)的关系:子类可以看作是父类的一种特殊情况。它继承父类的所有属性与方法。
比如:class My_str(str):
pass
子类就直接继承类str字符串的所有属性。
issubclass 检查两个类是否有继承关系: issubclass(My_str,str) 返回布尔值。
2.31 继承的实例与理解继承
# 父类:
class Dog:
def __init__(self,参数1,参数2...):
self.name = 参数1
.....
# 子类:
class Littledog(Dog): # Dog 传入这个类的头部括号,表示继承Dog父类
def __init__(self,参数1,参数2,...) # 像普通的类一样先初始化方法(大方向不变)另外:这里的self还是传入实例的
super().__init__(参数1,参数2) # 派生类特有,表示把父类的所有属性方法都拿过来用
增加新的属性与方法 #曲折之后回归
完结。