收藏 分销(赏)

Python编程金典-读书笔记.pdf

上传人:曲**** 文档编号:230060 上传时间:2023-03-20 格式:PDF 页数:49 大小:2.51MB
下载 相关 举报
Python编程金典-读书笔记.pdf_第1页
第1页 / 共49页
Python编程金典-读书笔记.pdf_第2页
第2页 / 共49页
Python编程金典-读书笔记.pdf_第3页
第3页 / 共49页
Python编程金典-读书笔记.pdf_第4页
第4页 / 共49页
Python编程金典-读书笔记.pdf_第5页
第5页 / 共49页
点击查看更多>>
资源描述

1、vv Back to Python编程金典读书笔记整理:Jims of肥肥世家第一次发布时间:2004年5月26 口Table of Contents1.绪论2.python编程概述2.1.知识点2.2.良好的编程习惯2.3.常见编程错误2.4.测试和调试提示2.5.移植性提示3.控制流程3.1.知识点3.2.良好的编程习惯3.3.常见编程错误3.4.移植性提示3.5.软件工程知识4.函数4.1.知识点4.2.良好的编程习惯4.3.常见编程错误4.4.移植性提示4.5.软件工程知识4.6.性能提示5.列表、元组和字典5.1.知识点6.公共网关接口(CGI)入门6.1.知识点7.基于面向对象的编

2、程7.1.知识点7.2.良好的编程习惯7.3.常见编程错误7.4.测试和调试提示7.5.软件工程知识7.6.性能提示8.自定义类8.1.知识点8.2.良好的编程习惯8.3.常见编程错误8.4.软件工程知识8.5.性能提示9.面向对象编程:继承9.1.知识点9.2.常见编程错误9.3.软件工程知识9.4.性能提示10.图形用户界面组件(一)10.1.知识点10.2.良好的编程习惯10.3.常见编程错误10.4.界面知识11.图形用户界面组件(二)11.1.知识点11.2.测试和调试提示1L3.界面知识12.异常处理12.1.知识点12.2.良好的编程习惯12.3.常见编程错误12.4.测试和调试

3、提示12.5.软件工程知识12.6.件能提示13.字符串处理和正则表达式13.1.知识点13.2.良好的编程习惯13.3.性能提示14.文件处理和序列化14.1.知识点14.2.良好编程习惯14.3.常见编程错误14.4.性能提示15.可扩展标记语言(XML)15.L 知识点15.2.常见编程错误15.3.移植性提示15.4.软件工程知识15.5.性能提示15.6.示例16.Python 的 XML 处理.16.1.知识点16.2.良好编程习惯16.3.示例17.数据库应用程序编程接口(DB-API)17.1.知识点17.2.良好的编程习惯17.3.常见编程错误17.4.移植性提示18.进程管

4、理18.L知 识点18.2.良好的编程习惯18.3.移植性提示19.多线程处理19.1.知识点19.2.性能提示19.3.常见编程错误19.4.测试和调试提示19.5.性能提示20.联网20.1.知识点20.2.常见编程错误20.3.软件工程知识20.4.性能提示List of Examples15.1.sort.xml15.2.sorting.xsl16.1.动态生成XML内容16.2.一个XML论坛的例子Chapter 1.绪论Chapter 2.python 编程概述Table of Contents2.1.知识点2.2.良好的编程习惯2.3.常见编程错误2.4.测试和调试提示2.5.移

5、植件提示2.1.知识点1.raw_input是python的内建函数,要求用户输入,输入结果是一个字符串。example:test=raw_input(please input a number:n)2.python是一种区分大小写的语言。3.id函数返回变量内存位置,type函数返回变量类型。4.在python2.2前,只提供一种除法运算符(/),运算的行为(即是Floor整数除法,还是True浮点除法)是由操作数的类型来决定的。如果操作数全是整数,就执行Floor除法。如一个或两个操作数是浮点数,就执 行True浮点除法。5.在python 2.2后的所有版本中,设计者决定去除(/)的随意

6、性。决定采用两个操作符,其中/执行True除法;执行Floor除法。但这样会造成旧版本的程序出错,所以设计者采取了 一种折衷的办法。如果不先声明,python还是使用旧的/操作符。如果要使用新的方法就要 进行声明,声明方式是:from_future import division,这样就可以用/和了。6.格式化字符串print test is%d%integerl,表示方法和c语言差不多。7.如果语句太长需要用到、这个续行符。8.在过程式编程中,程序员把重点放在写函数上,用于执行一些任务的行动被组合成函数,不同的函数进一步进 行组合,即构成程序。9.采用面向对象编程,程序员的工作主要放在创建自

7、已的类上。每个类包含数据及一系列函数。类的数据组件 被称为数据成员或属性,类的函数组件则称为方法。10.重用,重用,再重用是影响软件开发三大因素。就如影响房地产价格三大因素是地段,地段,不是地段。2.2.良好的编程习惯1.在程序中使用丰富的注释。注释有助于其他程序员理解程序,有助于程序员调试,并列出有用的信息。以后修 改或更新代码时,注释还有助于你理解自己当初编写的程序。2.每个程序都应以一条注释开始,描述该程序的用途。3.加一些空行来增强程序的可读性。4.有意义的变量名可改善程序的自编档能力”,也就是说,只需读一读程序,就能轻松理解它。5.避免标识符以下划线和双下划线开头,因为python解

8、释器可能保留了那些名称,供内部使用。6.在二元运算符两端添加一个空格。这样可以突出运算符,增强程序的可读性。7.和代数一样,可在表达式中添加原本不需要的括号,使其更清晰。2.3.常见编程错误1.试图访问一个未赋值的变量,会产生运行时错误。2.不要把=相等和=赋值运算符操混了。赋值符号=不能出现在if等的条件语句中。3.忘记在if结构中插入冒号是语法错误。if a=b:.4.不要忘记了缩进格式,否则会出现语法错误。由于tab键在不同系统中的长度不同,所以建议将3个空格定为 一个缩进级别。如果在一个程序中缩进量不同,会造成语法错误。2.4.测试和调试提示1.使用-i选项(python-i test

9、.py)0会导致编译器在执行了文件中的语句后进行交互模式,这非常适用于调 试程序。2.为了避免难以察觉的错误,务必在程序中采用统一和正确的缩进。2.5.移植性提示1.预计在python 3.0中,运算符/只执行True除法。3.0发布后,程序需更新自已的程序。Chapter 3.控制流程Table of Contents3.1.知识点3.2.良好的编程习惯3.3.常见编程错误3.4移 植性提示3.5.软件工程知识3.1.知识点1.所谓算法,是指解决一个问题的过程,它包含两个含义,1是要采取的行动,2是采取这些行动的顺序。2.研究表明,只要三种结构就可以写出所有程序,这三种结构是:顺序结构,选择

10、结构以及重复结构。3.算法求精,就是把算法用伪代码逐层分解成可以用python程序实现的过程。4.+=符号将符号右边的表达式的值加到左边的变量上,再将结果存回左边的变量。变量要先初始化,如果没有 会出错。5.range(0,10,1)代表一个从。到9共10个元素的序列,自增量为1。6.与非结构化程序相比,结构化编程所生成的程序要容量理解得多,所以更易测试、调试和修改,而且不易出 错。3.2.良好的编程习惯1.初始化所有变量。2.在信号值控制的循环中,当提示输入时,应明确指明信息值是哪一个。3.当执行除法运算时,如除数可能为零,请务必明确检测。关在程序中进行相应处理,不要任由错误发生。4.在每个

11、控制结构前后各留一个空行,将其同程序的其余部份区分开。5.嵌套级别过多,会使程序难以理解,通常应将嵌套控制在3级以内。6.避免在for循环主体更改控制变量的值,这有可能导致不易发现的逻辑错误。3.3.常见编程错误1.将所有浮点数假设为是精确的,会导致不正确的结果。浮点数在大多数计算机中只是近似数。2.在赋值符号左边的变量初始化之前试图使用增量赋值是错误的。3.如果忘记range函数返回的序列的第一个值是0,可以导致差1错误。3.4.移植性提示1.python 2.0开始引入增量赋值符号,在老版本中python中使用增量赋值符号是语法错误。3.5.软件工程知识1.经验表明,用计算机解决问题最有效

12、的办法是为解决方案开发一种算法。一旦开发出正确的算法,通常能根据 它方便地生成一个能实际工作的python程序。2.在从事大型的、复杂的项目时,一定要开发算法。这样才可能不会导致严重错误,从而推迟项目进度。Chapter 4.函数Table of Contents4.1.知识点4.2.良好的编程习惯4.3.常见编程错误4.4移 植性提示4.5.软件工程知识4.6.性能提示4.1.知识点1.python的程序组件包括函数、类、模块和包。模块是包含函数和类定义的文件。许多模块可以组合成一个 集合,称为包。2.模块位于python安装目录的库目录下。在unix/linux下,是/usr/lib/py

13、t:hon2.2或/usr/local/lib/python2.2,windows 上,贝U是pythonlib。3.函数定义中创建的所有变量都是局部变量”一只存在于声明它们的函数中。4.python定义了 3个命名空间,分别是局部(local),全局(global)和内建(built-in)o程 序访问标识符 的值时,python会按特定顺序搜索命名空间(即按局部,全局和内建顺序)。5.import random as randomModule指定引用名。现在可以用randomModule来引用random中的函数。6.重复使用重复的结构,如for和while;递归使用选择结构,如if和if

14、/else。之间的差别是,重复采用一个重 复结构,而递归采用重复的函数调用。两者都要进行终止测试:重复会在循环继续条件为false时终止;递归 在识别出基本条件是终止。由计数器控制的重复和递归都是逐渐终止:重复会不断改变一个计数器,直到计数 器的值使循环继续条件变为false;递归则不断对原始问题进行简化,直到抵达基本条件。重复和递归都可无 休止地进行:如果循环继续检测永远都不能变成false,会发生无限循环;如果递归调用永远不能将问题简化 成基本条件,会发生无穷递归。7.函数的默认参数设置需在def语句中定义。如:deftest(aa=l,bb=2,cc=3):xxx。8.关键字参数可以不按

15、位置顺序出现在函数调用中。用keyword=value方式就可以了。4.2.良好的编程习惯1.尽快熟悉核心python模块提供的函数和类集合。2.避免变量名遮蔽外层作用域中的名称。为此,要注意避免标识符与内建命名空间中的标识符同名,并避免在程 序中使用重复的标识符。3.使用默认参数可简化函数调用的编写,但有的程序员认为,显式指定所有参数会使程序更易读。4.3.常见编程错误1.用局部命名空间中的一个标识符遮蔽模块或内建命名空间中的一个标识符,可能引起逻 辑错误。2.默认参数必须全部靠右。省略非靠右的参数是语法错误。4.4.移植性提示1.使用核心python模块中的函数,通常可使用程序更易移植。4

16、.5.软件工程知识1.避免重复别人的劳动。尽量使用标准库模块函数,不要写新函数。这样可加快程序开发进度,并增强可靠性。因为你所使用的是经良好设计和测试的代码。2.每个函数都应该只限执行单一的、良好定义的任务,函数名应清楚地描述那个任务。3.如果实在想不出能准确表达函数作用的名称,就表明函数可能执行了太多的分散任务,通常,最好把这种函数 分解成多个更小的函数。4.程序应写为若干个小函数的集合。这样使程序更易编写、调试、维护和修改。5.如函数需要大量的参数,表明它执行的任务可能过多。请考虑将函数分解成更小的函数,令其执行单独的任 务。函数的def语句尽可能不超过一行。6.采用递归方式能解决的任何问

17、题也可采用重复方式(非递归方式)解决。如果递归方式能够更自然地反映问 题,并使程序易于理解和调试,通常应该首选递归方式。通常,只需几行代码就可完成一个递归方式,重复方 式则相反,它需要大量的代码来实现。选择递归的另一个原因是,重复方案也许不是很直观。7.采用清晰的、层次清楚的方式对程序进行函数化,有助于保证良好的软件工程,但性能上要付出一定代价。4.6.性能提示1.不要试图改写现成的模块函数使其更高效,因为这些函数已非常完美了。2.一般不要编写会造成调用次数成指数级增加的斐波拉契式递归程序。3.避免对性能要求高的时候使用递归。递归调用既费时、又耗内存。4.一个由多个函数构成的程序,与一个没有任

18、何函数的一体式程序相比,会产生大量的函数调用,这些函数调用 会占用大量的处理器时间和内存。但另一方面,一体式程序的编程、测试、调试和维护都比较复杂。因此对程 序进行函数化时要综合考虑。保证能兼顾良好的性能和软件工程。Chapter 5.列表、元组和字典Table of Contents 5.1.知识点5.1.知识点1.Python支持3种基本序列数据类型:字符串(string),列表(list)和元组(tuple)。2.映射在其它语言中称为关联数据或哈希,是用于存储键-值对的数据结构。python支持一种映射数据类 型,字典。3.创建序列:aString=aList=;aTuple=()。列表

19、是可变序列,字符串和元组是不可序列。Chapter 6.公共网关接口(CGD入门Table of Contents6.1.知识点6.1.知识点1.CGI可用于几乎任何程序语言或脚本语言,比如C,PERL和PYTHON。2.最常见的HTTP请求类型是GET AND POST。这些请求从WEB服务器获取资源,并将客户表单数据发送给 WEB服务器。get请求将表单内容作为URL的一部份发送。大多数WEB服务器将GET请求查询字符串限制 在1024个字符以内。如果查询字符串超过这个限制,就必须使用POST请求。POST请求中发送的数据不是 URL的一部份,用户看不到它们。如果表单包含许多字段,那通常由

20、POST请求进行提交。一些敏感的表单字 段,如用户名和密码,也通常使用这种请求类型来发送。GET请求的最简单形式的格式为GET/books/downloads.html HTTP/1.1。服务器收到请求后,会发送一个HTTP标头,如Contenttype:text/html0 表明MIME类型,然后服务器发送请求的HTML/XHTML文档中文 本(DOWNLOADS.HTML)。3.web应用程序采用两类脚本编程,服务器端和客户端。CGI脚本是服务器端脚本的一个例子,客户端脚本的一 个例子是javascript。Chapter 7.基于面向对象的编程Table of Contents7.1.知

21、识点72.良好的编程习惯73常见编程错误74.测试和调试提示75.软件工程知识76.性能提示7.1.知识点1.在过程式语言中,基本编程单元是函数,在面向对象语言中,基本编程单元是类,最终要通过它来实例化(即创建)对象。2.方法是类的构造函数方法。每次创建类的一个对象时,都会执行它的构造函数。它会初始化对象属性,并返回None。3.包括构造函数在内的所有方法至少要指定一个参数。该参数代表要调用其方法的类的对象。人们常把这个参数 称为类实例对象”。但由于这术语容易混淆,所以我们将任何方法的第一个参数都称为对象引用参数”,或简 称对象引用方法必须通过对象引用来访问从属于类的属性以及其它方法。按照约定

22、,对象引用参数称为 selfo4.类的特殊属性。_bases_ 包含基类的一个元组,类可以从这些基类直接继承。如果类不从其他类继承,元组就会为 空。_dict_ 与类的命名空间对应的一个字典。其中每个键-值对都代表在命名空间中的一个标识符及其 值。_doc_ 类的文档字符串。如果类没有指定文档化字符串,值为None。_module_ 包含模块(文件)名的一个字符串,类定义于这个模块中。name包含类名的一个字符串。5.在C+和java等程序语言中,类可明确指出类的客户能访问哪些属性或方法。这些属性 或方法被认为是公 共”的。不能由类的客户访问的属性和方法则被认为是私有的。在python中,对象

23、的属性是肯定能访问的-没 有办法阻止其它代码访问数据。然而,python提供一种特别的机制来防止任意访问数据。在属性名附加双下 划线前缀。python解释器会对属性执行 名称重整”。如self.hour,python会创建一个 _Classname_hour的属性。但它一样是可访问的,只是名字变了。6.构造函数也可以定义默认参数,从而在客户没有指定参数的前提下,为对象属性指定初始值。还可以定义关键 字参数。7.析构函数_del_是构造函数的相反,用于执行终止清理,然后由解释器回收对象的内存,使内存 能被重用。析构函数通常只指定self参数,并返回None。8.类的每个对象都拥有在构造函数中创建

24、的所有属性的拷贝。特定情况下,类的所有对象只能共享属性的一个拷 贝。为此要使用类属性。它是类范围的信息(也就是说,它是类的一个属性,而非类的特定对象属性)。它可节省空间和时间,提高性能。为访问类属性,只需为属性名附加类名前缀,再加一个小数点即可。(Classname.xxx)7.2.良好的编程习惯1.文档化字符串习惯上是一个三引号字符串。这样可以在不改变引号样式的前提下,扩展一个程序的文档(例如 添加更多的行)。2.尽可包含文档化字符串,使程序更有条理。3.将所有方法的第一个参数都命名为self。始终遵循这一命名约定,可确保不同程序员编写的python程序是一 致的。4.属性名以单下划线开头,

25、虽然在python语法中没有特殊的含义,但单下划线是python程序员使用类时约定 使用的符号,表明程序员不希望类的用户直接访问属性。以单划线开头的属性揭示一个类的接口的相关信息。类如果定义了此类属性,它的客户就只能通过类提供的访问方法来访问并修改属性值。如果不是这样做,通常 会导致程序执行期间出现不可预料的错误。7.3.常见编程错误1.忘记将对象引用(通常是self参数)设为方法定义中的第一个参数,会导致该方法在运 行时被调用时,造成严 重逻辑错误。2.直接访问对象的属性可能导致数据进入不一致状态。一个办法是让类提供访问方法”,通过一种得到精心控制 的方式来读写类数据。3.如果忘记在方法内部

26、通过对象引用(通常称为self)来访问由对象的类定义的另一个方法,就会导致严重的运 行时错误或者逻辑错误。如全局命名空间包含的一个函数与类的某个方法同名,就会产生逻辑错误。此时,如 果忘记通过对象引用来访问方法名,实际会调用全 局函数。7.4.测试和调试提示1.即使提供了访问方法,也无法自动确保数据完整性,程序员必须提供有效性验证。7.5.软件工程知识1.本书的中心思想是重用,重用,再重用”。我们的重点是创建宝贵的类,创造有价值的软件资产”。2.先初始化对象,再让客户代码调用对象的方法。不能依赖客户代码正确初始化对象。3.利用访问方法控制对属性的访问(尤其是写访问)有助于确保数据完整性。4.p

27、ython的类和模块化机利于程序的独立实现。如果代码所用的一个类的实现发生了改变,这段代码是无需更 改的。5.并不是所有的方法都要作为类的接口的一部份。有的方法是类的其它方法的一种实用方法,不准备供类的客户 使用。6.将客户不应该访问的任何数据设为私有。7.如果类的一个方法提供了构造函数(或其他方法)需要的全部或部份功能,请从构造函数(或其他方法)中调 用那个方法。这样可简化代码的维护,并减少代码的实现改变后出错的可能。一个通用规则是:避免重复代 码。8.合成是软件重用的一种形式,即类的成员引用了其他类的对象。9.在类成员引用了另一个类的对象的前提下,使那个成员对象能被公共访问,不但没有违反封

28、装性,而且还可隐 藏那个成员对象的私有成员7.6.性能提示1.链式比较表达式(0=a=0 and a 10)更高,因为链式比较表达 式中的每个条件都只执行一次。2.如果数据的一个拷贝已经够用,请用类属性以节省空间。Chapter 8.自定义类Table of Contents8.1.知识点8.2.良好的编程习惯8.3常 见编程错误8.4.软件工程知识8.5.性能提示8.1.知识点1.运算符+在python中具有多种用途,比如整数加法和字符串连接。这就是运算符重载的一个例子。它会在不 同的背景下执行最恰当的运算。2.python类可定义特殊方法_str_,为类的对象提供一个不正式的(即人们更容易

29、理解的)字符串表示。如果 类的客户程序包含以下语句:print objectofclass,那么python会调用对象的str_方法,并输出那个方 法所返回的字符串。如:print test就会执行以下语句:print test.str_3.前面介绍客户访问对象属性的方法有两种,一种是客户可直接访问属性(使用点访问运 算符):另外,也可通 过客户定义的访问方法来访问属性。这一节讨论另外一种技术-定义特殊方法,自定义直接属性访问的行为。python提供了一系列特殊方法,类可定义这此方法,以控制点访问运算符操纵类对象的方式。如:delattr 客户删除一个属性时执行(例如del anObject.

30、attribute)getattr_ 客户访问一个属性名,但在对象diet属性中找不到这个名称时执行(例如 anObject.unfoundName)setattr_ 客户将值指派给对象的属性时执行(例如anObject.attribute=value)4.在多数python运算符和增量赋值符号都能重载,有两个运算符不能重载,即和lambda。5.如果重载一元运算符(如+-*),会自动重载与运算符对应的增量赋值语句。8.2.良好的编程习惯1.如有必要,请为你创建的模块提供test函数,这些函数可确保模块正常工作,而且能通过演示模块的工作方 式,向客户提供额外的信息。如以下语句:ifname=m

31、ain test()如果另一个程序导入模块,_name_的值就会是模块名,而test函数不会执行。如果模块作为单独的程序 执行,name的值是_main,test函数就会执行。8.3.常见编程错误1.从_str_方法返回非字符串值是严重的运行时错误。2.在_setatti_方法中,通过点访问运算符为对象属性指派值会造成无穷递归。相反,应使用对象的_dic_ 属性。见 chapter8.2.py8.4.软件工程知识1.对于大型系统,如果需要严格的数据访问,设计者就应使用_getattr_和_setattr_来确保数据的完整 性。大型系统的开发者如果使用python2.2,可借助于Properti

32、es这种更高效技术来利用getattr_ 和 setattr。8.5.性能提示1.有时,更好的方法是重载运算符的增量赋值版本,以便能够当场执行操作(也就是说,不通过新建对象来占 用额外的内存)。Chapter 9.面向对象编程:继承Table of Contents9.1.知识点9.2.常见编程错误93.软件工程知识9.4.性能提示9.1.知识点1.创建新类时,程序员不必编写全新的属性和方法,只需指明新类继承以前定义好的基类的属性和方法。新类 称为派生类。每个派生类本身也可以是未来一些派生类的基类。在单一继承中,类只从一个基类派生;但 在多重继承中,派生类要从多个基类继承。2.覆盖后的派生类构

33、造函数通常会调用基类构造函数,从而先初始化基类属性,再初始化派生类属性。3.派生类可覆盖一个基类方法,做法是采取相同的名称提供那个方法的一个新版本。4.通过继承,可自定义现有软件。首先继承现有类的属性和行为,再添加新的属性或行为,或覆盖基类行为,从 而对类进行自定义,使之符合我们的要求。5.基类指的是公共特性-从基类继承的所有类者得到了基类的功能。在面向对象设计过程中,设计者要找出公共 特性,并对其进行归纳,以构成合理的基类。然后,派生类自定义基类功能之外的功能。6.绑定方法调用是通过一个对象来访问方法名,如anObject.method。非绑定方法调用需要通过类名来访问 方法,并专门传递一个

34、对象引用。如Point._init_(self,x,y),self(Cricle类的一个对象)作为对象引用传 递。7.我们在把类想像成一种类型时,就假定要创建那个类型的对象。但是,偶然也需要定义一些类(程序员永远不 打算创建它的任何对象)。这样的类称为抽象类。由于它们在继承层次结构中作为基类使用,所以通常把它 们称为抽象基类。我们不为抽象类创建对象。它惟一的用途是提供一个合适的基类,以便其他类从中继承接 口,偶尔也继承它的实现,从中实际创建的类称为具体类。8.python支持多态性,通过继承联系在一起的各个不同类的对象可针对同样的消息(方法调用)做出不同的 响应。发送给多个类型的对象的相同的消

35、息会呈现出多种型态-这正是多态性一词的来历。例如,假定矩 形类从四边形类派生,那么矩形属于四边形的一个更具体的版本,能对四边形类的一个对象执行的操作(比台 计算周长或面积),也能对矩形类的一个对象执行。9.现在讨论一下多态性的应用。一个屏幕管理器需要显示不同类的大量对象,其中包括软件写好之后再加入系统 的新类型。系统要能显示各种几何形状(基类是shape),例如正方形,圆形,三角形,矩形,点,线等等(都从基类shape类派生)。屏幕管理器使用基类引用来管理所有需要显示的类。绘制任何对象时(无论它位 于继承层次结构的哪一级),屏幕管理 器都只是向对象发送一条draw消息。draw方法在每个派生类

36、中都能 被覆盖。shape类的每个对象都知道怎样绘制自已。屏幕管理器不需要关心每个对象的类型,也不需要关心以 前是 否见过这一种类型的对象-它只需要告诉每个对象draw自已就可以了。10.多态性尤其适合实现分层式软件系统。例如在操作系统中,每类物理设备的工作方式都是不同的,但无论如 何,从设备读和写数据的命令肯定能统一。发送给设备驱动程序对象的写消息需要在那个设备驱动程序 的背景下进行专门解释,这具体取决于设备驱动程序怎样操纵特定类型的设备。但是,就写调用本身来说,它和向系统中其它任何设备的写入操作没有任何区别-都是将一些数量的字节从内存中放到设备中。面向对 象的操作系统可使用一个抽象基类提供

37、适用于所有设备驱动程序的一个接口。然后,通过从这个抽象类继承,派生类可采取类似的方式工作。设备驱动程序具有的功能(即接口)作为抽象基类中的方法提供。在派生类 中,对这些方法进行了具体的实现,它们与特定类型的设备驱动程序是相对应的。11.通过多态性编程,程序可遍历一个容器,比如由类层次结构各个级别上的对象构成的一个列表。只需发关一条 消息就能执行列表中的所有对象。12.在python2.2之前的版木中,类和类型是两种截然不同的编程元素。所以程序员不能从内建类型继承,不便 使用列表,字典和其它对象提供的高级数据处理能力。自python2.2起,类的本质与行为都发生了变化,消 除了类型和类的差异。在

38、将来的所有2.X版本中,程序员可区分两种不同的类,即所谓的经典类(它的行为 方式与本章前面以及前两章所展示的类相同)以及新类(它们具有新的行为)。object类型用于定义新类 型。直接或间接继承 于。bject的所有类都具有为新类定义的行为。13.所有类都可定义静态方法”。静态方法可由一个客户调用,即使不存在类的任何对象。通常,静态方法是类的 一个实用方法,不需要类的一个对象就能执行。一个类如果想把方法指定为静态的,就必须向内建函数 staticmethod传递方法的名称。再为函数调用返回的值绑 定一个名称。静态方法不将self指定为第一个参 数。这样一来,即使没有类的对象,也能调用静态方法。

39、14.静态方法在java等语言中至关重要,这些语言要求程序员将所有代码都放入一个类定义中。使用这些语言,程序员经常要定义只包含表态实用方法的类。随后,类的客户可调用静态方法,这和python程序调用模块里 定义的函数的方式非常相似。在python中,静态方法允许程序员更准确地定义一个类接口。如果类的方法不 需要类的对象即可执行其的任务,程序员就可将这个方法指定为静态的。15.从基类object继承的类也可定义_getattribute_方法,每次访问属性时都会执行它。派生类中的 _getattribute_方法必须调用方法的基类版本,才能获取属性值,这是由于假如通过对象的_dict_来访 问属

40、性值,会造成对getattribute的另一次调用。16.python2.2允许新类定义一个_slots_属性,它可列出只允许类的对象拥有的属性。9.2.常见编程错误1.如果派生类的已覆盖构造函数需要调用基类构造函数来初始化基类的成员,派生类构造函数就必须显式地调用 基类构造函数。不从派生类中调用基类构造函数是逻辑错误。2.基类方法在派生类中被覆盖后,经常要让派生类版本调用基类版本,并执行一些附加的操作。在这种情况下,如果不使用基类名称来引用基类方法(也就是为基类方法附加基类名称和一个点前缀),会造成无穷递归,因 为派生类方法实际调用的是自身。这最终导致系统 死机。3.不将非绑定方法调用的第一

41、个参数指定为对象引用是逻辑错误。4.要保证正确的属性访问,_getattribute_方法的一个派生类版本应该调用该方法的基类版本。如试图通过访 问对象的_dict_来返回属性值,会造成无穷递归。9.3.软件工程知识1.和其他任何类一样,派生类不一定要定义构造函数。如果派生类没有定义构造函数,一旦客户创建类的一个对 象,就会创建类的基类构造函数。2.创建派生类不会影响其基类源代码;基类的完整性通过继承获得了保持。3.在面向对象系统中,类通常是紧密联系的。因此,请归纳出公共属性和行为,将其放入一个基类,然后通过继 承来生成派生类。4.修改基类时,只要到基类的接口保持不变,就不必修改派生类。5.通

42、过多态性,程序员可关注于公共特性,让执行时环境去关心具体特性。程序员可在不知道那些对象是什么类 型的情况下,指示大量对象采取恰当的行动。6.多态性增强了扩展性:软件如果要调用多态行为,编写时便不用关心要向其发送消息的对象类型。因此可在不 修改基本系统的前提下,自由添加新类型对象,令其响应现有的消息。7.抽象类为类层次结构的各个成员定义了一个接口。抽象类包含的方法将在派生类中定义。在多态性的帮助下,层次结构中的所有方法都可使用同一个接口。8.如果新类定义了_slots属性,但类的构造函数没有初始化属性值,那么一旦创建该类的一个对象,python 就会将None值指派给slots中的每个属性。9.

43、派生类会继承它的基类的_slots_属性。然而,如果不希望程序为派生类的对象添加属性,派生类就必须定 义自己的_slots_属性。在派生类的_slots_中,只包含允许的派生类属性名,但客户仍可为派生类的直 接/间接基类所指定的属性赋值。9.4.性能提示1.如果通过继承生成的类超过所需,可能会无谓地浪费内存和处理器资源。因此,请从最 能满足你需求的类继承。Chapter 10.图形用户界面组件(一)Table of Contents 1。1.知识点102.良好的编程习惯103.常见编程错误104.界面知识10.1.知识点1.GUI是事件驱动的,也就是说,一旦用户与GUI交互,GUI组件就会生成

44、事件(动 作)。常见交互包括移 动鼠标、单击鼠标按钮、在文字段输入、从菜单选择一个选项以及关闭一个窗口等等。2.Tkinter模块中的每一个Tk GUI组件都是从Widget类继承的一个类。所有从Widget派 生的类都具有公共 的属性及行为。3.Entry(输入)组件是一种特殊的屏幕区域,用户可以在其中输入文本,也可显示一行文本。4.pack方法规定了组件应该如何放到它的父中,以及应该放到什么地方。5.如果程序员不指定名称,Tkinter会为每个组件分配一个不重复的名称。要想获得一个组件的完整名称,将组 件对象传给str函数即可。6.bind方法将一个(Return事件同textl组件关联在

45、一起。一旦用户按下回车键,Return事件就会发生。bind方法要取得两个参数,一个是事件类型(事件格式),一个是要与事件绑定的那个方法的名称。7.insert方法在Entry组件中写入文本,它要取得两个参数:文本插入的位置和包含插入文本的一个字符串。如 果第一个参数是INSERT,文本就会在当前光标位置插入。如果是END,则在末尾插入,如:insert(END,text)o不可用delete(start,finish)方法从Entry组件中删除文本。在Entry组件中,第一个位置编号是0,所以如果deleted,END)则是删除所有文本。8.Widget的winfo_name方法返回组件名,

46、Entry的get方法返回Entry的内容。showinfo()函数显示一个 标记为message的对话框。9.Button的command关键字参数指定了在用户选择按钮之后要执行的事件处理程序。10.pack的参数,side指明组件要靠在容器的哪一边,可选择TOP(DEFAULT),BOTTOM,LEFT和RIGHT。fill 指定组件在容器中应占据的空间(在指定的方向上),可设为NONE(DEFAULT),X,Y或BOTH。expand设置 组件只否自动扩展,填充容器中彳壬何额外的空间。padx and pady可围绕组脚插入空白填充。pack_forget 方法可从容器中删除一个pack

47、好的组件。11.Grid布局管理器将容器分割为一个网格,使组件能以行、列形式放置。组件在网格中的位置由其row和 column值决定;网格中的每个单元格都可包含一个组件。行、列编号从0开始。还可以调 用rowconfigure 和columnconfigure方法来设置行和列。12.place布局管理器允许设置一个GUI组件的位置和大小-既可以是绝对值,也可是与另一个组件的相对位置 和大小。它较复杂在这里不详细讨论。10.2.良好的编程习惯1.为每个Button都单独定义一个回调方法,这有助于避免混淆,确保实现目标行为,并简化GUI的调试。2.妥善选择布局管理器可使GUI编程更容易。编程之前,

48、先画好设计图,再选择最合适的布局管理器。可用的布 局管理器有三种,Pack(按添加的顺序放置组件),Grid(以行、列形式排列组件),Place(允许程序员指定 组件和窗口的大小和位置)。10.3.常见编程错误1.在同一个容器中使用多种类型的布局管理器,一旦Tkinter试图协调不同管理器的不同需求,就 会导致应用程 序死机。2.pack方法按定义顺序将各组件放到一个容器中,所以,如果错误定义顺序,会导致不可预料的结果,相反,如果放置组件时,采用了为side,expand,fill,padx,pady指派值的方式,就可以忽略其定义顺序,保证获得 所需结果。3.有时可能指定重叠组件。代码中先出现

49、的组件会被最近添加的组件遮住。10.4.界面知识1.通过改变按钮的显示效果,可提供一种视觉线索,让用户知道自已已经选中了按钮,而且发生了相应的动作。Chapter 11.图形用户界面组件(一一)Table of Contents11.1.知识点11.2.测试和调试提示11.3.界面知识11.1.知识点1.python巨元件(Python Megawidgets,Pmw)提供高级的GUI组件,它是基于Tkinter模块提供 的较少的 组件开发的。每个Pmw组件都合并了一个或多个Tkinter组件,从而生成更有用,更复杂的组件。2.ScrolledListBox组件叫滚动列表框,是由于列表中的项目

50、个数较多,以至于列表无法在屏幕上显示时的解决 方案。3.ScrolledText组件其实是能滚动的Tkinter Text组件。4.MenuBar组件用于创建菜单。5.Canvas组件用于显示文本、图像、线条、和形状。6.Scale(滑杆)组件允许用户从一系列整数值中选择。7.其它GUI工具包有:PyGTK为GimpTooKit组件提供了面向对象的接口。GTK是一个高级的组件集,主要 在X WINDOWS系统中使用。PyGTK是GTK+的一部份,后者也是一个Python工具包,用于创建图形用户界 面。另一个流行的GUI工具质是wxPython,它是一个Python扩展模隹,提供了对wxWind

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 考试专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服