第4章 案例研究:接口设计
4.1 乌龟世界
程序包(package)是多个模块的组合;Swampy中有一个模块“乌龟世界”(TurtleWorld),它提供各种函数,可以引导一只乌龟在屏幕上爬行,并画出其踪迹。
系统中安装好了Swampy之后,就可以像下面这样导入TurtleWorld模块:
from swampy.TurtleWorld import *
如果你下载了Swampy但并没有安装,则可以在其代码目录中使用,或者将其目录加入到Python的搜索路径中。接下来就可以这样导入TurtleWorld:
from TurtleWorld import *
安装过程的细节和如何设置Python的搜索路径,依赖于你所使用的系统。所以我在这里不细加讨论,而在http://thinkpython.com/swampy 里维护几种系统的相关安装信息。
创建一个文件mypolygon.py,并输入如下代码:
from swampy.TurtleWorld import *
world = TurtleWorld()
bob = Turtle()
print bob
wait_for_user()
第一行从swampy程序包的TurtleWorld模块里导入全部成员。
接下来几行建立一个TurtleWorld对象,赋值给变量world;建立一个Turtle对象,赋值给bob。
打印bob对象会得到如下信息:
<TurtleWorld.Turtle instance at 0xb7bfbf4c>
这意味着bob变量引用着TurtleWorld模块中定义的Turtle类的一个实例(instance)。在这个语境中,“实例”是指集合中的一员;bob这个Turtle对象是可能存在的所有Turtle的集合的一员。
wait_for_user告诉TurtleWorld等待用户进行某些操作,虽然现在除了关闭窗口之外,并没有提供给用户多少有用的操作。
TurtleWorld提供了几个用来指挥乌龟的函数:fd和bk用于前进和后退,lt和rt用于左转和右转。另外,每只乌龟都拿着一只笔,可以朝上或者朝下;若笔朝下,则会绘制出走过的路迹。函数pu和pd分别表示“笔朝上”(pen up)和“笔朝下”(pen down)。
若要画一个朝右的角,在程序中(建立bob实例之后,调用wait_for_user之前)添加如下代码:
fd(bob, 100)
lt(bob)
fd(bob, 100)
第一行告诉bob前进100步。第二行告诉它左拐。
当你运行这个程序时,将会看到bob先向东走,再向北走,身后留下两条线段。
现在试着修改程序,画出一个正方形来。在成功之前请不要继续!