一般练习

1.         复习下面概念:抽象数据类型,接口,实现,过程抽象和数据抽象,类型,内置类型和用户定义类型,表示,不变类型和可变类型,不变对象和可变对象,类,类定义和类对象,类对象名字空间,类的属性(数据属性和函数属性),类的实例(实例对象,对象),方法,实例方法,self参数,方法和函数,函数isinstance,初始化方法,实例的属性和属性赋值,静态方法,类方法,实例变量和私有变量,特殊方法名,继承,基类,派生类,方法覆盖,替换原理,类层次结构,类object,函数issubclass,类方法查找,静态约束和动态约束,函数superPython标准异常,异常类层次结构,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类的对象可以采用不同的内部表示方式。例如,可以给每个对象定义三个数据属性hoursminutesseconds,基于这种表示实现操作。也可以用一个属性seconds,构造对象时算出参数相对于基准时间000秒的秒值,同样可以实现所有操作。请从各方面权衡利弊,选择合适的设计。

上面情况表现出“抽象数据类型”的抽象性,其内部实现与使用良好隔离,换一种实现方式(或改变一些操作的实现技术)可以不影响使用它的代码。

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节的工作继续扩充,为该学校人事系统定义研究生类、教师类和职员类。