1.
复习下面概念:抽象数据类型,接口,实现,过程抽象和数据抽象,类型,内置类型和用户定义类型,表示,不变类型和可变类型,不变对象和可变对象,类,类定义和类对象,类对象名字空间,类的属性(数据属性和函数属性),类的实例(实例对象,对象),方法,实例方法,self参数,方法和函数,函数isinstance,初始化方法,实例的属性和属性赋值,静态方法,类方法,实例变量和私有变量,特殊方法名,继承,基类,派生类,方法覆盖,替换原理,类层次结构,类object,函数issubclass,类方法查找,静态约束和动态约束,函数super,Python标准异常,异常类层次结构,Exception异常,Python异常的传播和捕捉,
2.
请列举出数据类型的三类操作,说明它们的意义和作用。
3.
为什么需要初始化函数?其重要意义和作用是什么?
4.
设法说明在实际中某些类型应该定义为不变类型,另一些类型应该定义为可变类型。请各举出两个例子。
5.
请简要说明在定义一个数据类型时应该考虑哪些问题?
6.
请检查正文中给出的Date抽象数据类型,讨论其中操作的语义说明里有哪些不精确之处,设法做些修改,消除描述中的歧义性。
7.
请解释并比较类定义中的三类方法:实例方法、静态方法和类方法。
8.
列出Python编程中有关类属性命名的约定。
9.
请通过实例比较类作用域与函数作用域的差异。
10. 试比较正文中采用元组实现有理数和采用类实现有理数的技术,讨论这两种不同方式各自的优点和缺点。
1.
定义一个表示时间的类Time,它提供下面操作:
a)
Time(hours,minutes,seconds) 创建一个时间对象;
b)
t.hours(),t.minutes(),t.seconds() 分别返回时间对象t的小时、分钟和秒钟值;
c)
为Time对象定义加法和减法操作(用运算符 + 和 -);
d)
定义时间对象的等于和小于关系运算(用运算符 == 和 <)。
注意:Time类的对象可以采用不同的内部表示方式。例如,可以给每个对象定义三个数据属性hours、minutes和seconds,基于这种表示实现操作。也可以用一个属性seconds,构造对象时算出参数相对于基准时间0点0分0秒的秒值,同样可以实现所有操作。请从各方面权衡利弊,选择合适的设计。
上面情况表现出“抽象数据类型”的抽象性,其内部实现与使用良好隔离,换一种实现方式(或改变一些操作的实现技术)可以不影响使用它的代码。
2.
请定义一个类,实现正文中描述的Date抽象数据类型。
3.
扩充正文中给出的有理数类,加入一些功能:
e)
其他运算符的定义;
f)
各种比较和判断运算符的定义;
g)
转换到整数(取整)和浮点数的方法;
h)
给初始化函数加入从浮点数构造有理数的功能(Python标准库浮点数类型的as_integer_ratio() 函数可以用在这里)。
对应运算符的特殊函数名请查看语言手册3.3.7节(Emulating numeric types)。
4.
正文2.2.2节的有理数类实现中有一个缺点:每次调用类中的 __init__,都会对两个给定参数做一遍彻底检查。但是,把它们用在有理数运算函数中构造结果时,其中一些检查并不必要,浪费了时间。请查阅Python手册中与类有关的机制,特别是名字为 __new__ 的特殊方法等,设法修改有关函数的设计,使得其既能完成工作又能避免不必要的检查。
5.
请基于2.5节的工作继续扩充,为该学校人事系统定义研究生类、教师类和职员类。