资源预览内容
第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
第9页 / 共46页
第10页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Python面向对对象编编程1提纲纲2面向对对象程序设计设计对对象和类类属性和方法组组合、子类类、派生和继继承UML设计设计提纲纲3面向对对象程序设计设计对对象和类类属性和方法组组合、子类类、派生和继继承UML设计设计面向对对象程序设设计计4面向过过程的编编程根据操作数据的函数或语语句块块来设计设计 程序的面向对对象的编编程数据和功能结结合起来,用称为为对对象的东东西包裹 起来组织组织 程序的方法。在大多数时时候你可以使用过过程性编编程,但是有 些时时候需要编编写大型程序或是寻寻求一个更加合 适的解决方案。面向对对象程序设设计计5类类和对对象是面向对对象编编程两个主要方面。类创类创 建一个新类类型,而对对象这这个类类的 实实例 。这类这类 似于你有一个int类类型的变变量,这这存储储整数 的变变量是int类类的实实例(对对象)。对对象可以使用普通的 属于 对对象的变变量存储储 数据。属于一个对对象或类类的变变量被称为为域。对对象也可以使用 属于 类类的函数来具有功能。这这 样样的函数被称为为类类的方法。域和方法可以合称为为类类的属性。提纲纲6面向对对象程序设计设计对对象和类类属性和方法组组合、子类类、派生和继继承UML设计设计对对象和类类7类类是对对象的定义义,而实实例是“真正的实实物”,它存放了类类中所定义义的对对象的具体信息域有两种类类型属于每个实实例/类类的对对象或属于类类本身。它们们分别别被称为为实实例变变量和类类变变量。类类使用class关键键字创创建。类类的域和方法被列在一个缩缩进进块块中。创创建一个类类使用class定义义,属性和函数都用缩进缩进 表示# Filename: simplestclass.py class Person:pass # An empty blockp = Person() print pprint Person8提纲纲9面向对对象程序设计设计对对象和类类属性和方法组组合、子类类、派生和继继承UML设计设计属性10与类类和对对象的名称空间间 绑绑定 的普通变变量, 即这这些名称只在这这些类类与对对象的前提下有 效。类类名.类变类变 量(使用对对象名.类类变变量也可访访问问)对对象名.对对象变变量定义义的位置类类属性 紧紧跟在类类定义义之后对对象属性 在 init 中使用self.xxx=定义义使用类类数据属性11方法的定义义类类的方法与普通的函数只有一个特别别的区 别别它们们必须须有一个额额外的第一个参数 名称,但是在调调用这这个方法的时时候你不为为 这这个参数赋值赋值 ,Python会提供这这个值值。这这个特别别的变变量指对对象本身,按照惯惯例它 的名称是self。可以是任意一个变变量名,但最好遵循通用 的规则规则 。init构造函数,del析构函数12Self参数的工作原理13假如你有一个类类称为为MyClass和这这个类类的一 个实实例MyObject。当你调调用这这个对对象的方 法MyObject.method(arg1, arg2)的时时候,这这 会由Python自动动转为转为 MyClass.method(MyObject, arg1, arg2)这这就是self的原理了。如果你有一个不需要参数的方法,你还还是 得给这给这 个方法定义义一个self参数。方法的使用调调用方法同普通函数一致,忽略self参数。对对象名.方法名(参数)14方法的使用没有实实例,方法是不能被调调用的。15init() 构造器方法16当类类被调调用,实实例化的第一步是创创建实实例 对对象。一旦对对象创创建了,Python 检查检查 是否实现实现 了 init ()方法。默认认情况下,如果没有定义义( 或覆盖)特殊方法 init (),对实对实 例不会施加 任何特别别的操作.任何所需的特定操作,都需要程序员员实实现现 init (),覆盖它的默认认行为为。如果 init ()没有实现实现 ,则则返回它的对对象,实实 例化过过程完毕毕。init() 构造器方法如果 init ()已经经被实实现现,那么它将被调调 用,实实例对对象作为为第一个参数(self)被传传递递 进进去,像标标准方法调调用一样样。调调用类时类时 ,传进传进 的任何参数都交给给了 init ()init (),是在解释释器为为你创创建一个实实例 后调调用的第一个方法,在你开始使用它之 前,这这一步可以让让你做些准备备工作。17del() 解构器方法有一个相应应的特殊解构器(destructor)方 法名为为del()。由于Python 具有垃圾对对象回收机制(靠引用计计 数),这这个函数要直到该实该实 例对对象所有的引用都 被清除掉后才会执执行。Python 中的解构器是在实实例释释放前提供特殊处处 理功能的方法,它们们通常没有被实现实现 ,因为为实实 例很少被显显式释释放。18使用缺省参数进进行实实例化19定义义一个类类来计计算假想旅馆馆租房费费用。 init ()构造器对对一些实实例属性进进行初始化。calcTotal()方法可以计计算每日所有费费用,如果提 供了天数,那么将计计算整个旅程全部的住宿费费 用。内建的round()函数可以大约计约计 算出最接近的费费 用(两个小数位)。使用缺省参数进进行实实例化20使用缺省参数进进行实实例化21使用缺省参数进进行实实例化22使用缺省参数进进行实实例化23最开始的两个假想例子都是在旧金山, 使 用了默认值认值 。然后是在西雅图图, 这这里我们们提供了不同的 销销售税和房间间税率。最后一个例子在华华盛顿顿特区。经经过计过计 算更 长长的假想时间时间 ,来扩扩展通常的用法:停留 五个工作日,外加一个周六,此时时有特价,假定是星期天出发发回家。使用缺省参数进进行实实例化24函数所有的灵活性,比如默认认参数,也可 以应应用到方法中去。在实实例化时时,可变长变长 度参数也是一个好的 特性。如果定义义了构造器,它不应应返回任何对对象因为实为实 例对对象是自动动在实实例化调调用后返回的。相应应地, init ()就不应应当返回任何对对象(应应 当为为None);否则则,就可能出现现冲突,因为为只 能返回实实例。提纲纲25面向对对象程序设计设计对对象和类类属性和方法组组合、子类类、派生和继继承UML设计设计组组合26一个类类被定义义后,目标标就是要把它当成一 个模块块来使用,并把这这些对对象嵌入到你的 代码码中去,同其它数据类类型及逻逻辑执辑执 行流 混合使用。有两种方法可以在你的代码码中利用类类。第一种是组组合。就是让让不同的类类混合并加入到 其它类类中,来增加功能和代码码重用性。另一种方法是通过过派生。子类类、派生和继继承27当你设计设计 “相同的类类但有一些不同的功能”时时,派生就是一个合理的选选择择了。面向对对象编编程能够够使用一个已经经定义义好的 类类,扩扩展它或者对对其进进行修改,而不会影 响系统统中使用现现存类类的其它代码码片段。允许类许类 特征在子孙类孙类 或子类类中进进行继继承。这这些子类类从基类类(或称祖先类类,超类类)继继承它 们们的核心属性。这这些派生可能会扩扩展到多代。组组合样样例28对对地址本类类的加强性设设计计。如果在设计设计 的过过程中,为为 names, addresses 等 等创创建了单单独的类类。最后我们们可能想把这这些工作集成到AddrBookEntry类类中去,而不是重新设设计计每一 个需要的类类。这样这样 节节省了时间时间 和精力,而且最后的结结果是容 易维护维护 的代码码 - 一块块代码码中的bugs 被修正, 将反映到整个应应用中。组组合样样例29这样这样 的类类可能包含一个Name 实实例,以及其 它的像 StreetAddress, Phone , Email, 还还可 能需要一些Date 实实例。下面是一个简单简单 的例子:class NewAddrBookEntry(object): # class definition 类类定义义new address book entry classdef init (self, nm, ph): # define constructor 定义义构造器 self.name = Name(nm) # create Name instance 创创建Name 实实例 self.phone = Phone(ph) # create Phone instance 创创建Phone 实实例 print Created instance for:, self.name组组合样样例30NewAddrBookEntry 类类由它自身和其它类类 组组合而成。这这就在一个类类和其它组组成类类之间间定义义了一种“has-a / 有一个”的关系。比如,我们们的NewAddrBookEntry 类类“有一个” Name 类实类实 例和一个Phone实实例。创创建复合对对象就可以实现这实现这 些附加的功能,并且很有意义义,因为为这这些类类都不相同。子类类和派生31如果必须须创创建不同类类型的地址本。希望EmplAddrBookEntry 类类中包含更多与工作 有关的属性,如员员工ID 和e-mail 地址?这这跟PersonalAddrBookEntry 类类不同,它包含 更多基于家庭的信息,比如家庭地址,关系, 生日等等。两种情况下,都不想到从头头开始设计设计 这这些 类类,因为这样为这样 做会重复创创建通用的AddressBook类时类时 的操作。子类类和派生32包含AddressBook 类类所有的特征和特性并 加入需要的定制特性不是很好吗吗?这这就是 类类派生的动动机和要求。创创建子类类的语语法看起来与普通(新式)类类没有 区别别,一个类类名,后跟一个或多个需要从 其中派生的父类类:class SubClassName (ParentClass1, parentClass2,.):class_suite继继承33继继承描述了基类类的属性如何“遗传遗传 ”给给派 生类类。一个子类类可以继继承它的基类类的任何属性, 不管是数据属性还还是方法。P 是一个没有属性的简单类简单类 。C 从P 继继承而 来(因此是它的子类类),也没有属性:class P(object): # parent class 父类类passclass C(P): # child class 子类类pass继继承34因为为P 没有属性,C 没有继继承到什么。下面我们给们给 P 添加一些属性:class P: # parent class 父类类P classdef init (self):print created an instance of, self. class . name class C(P): # child class 子类类pass继继承现现在所创创建的P 有文档字符串(doc) 和构造器,当我们实们实 例化P 时时它被执执行,如 下所示:35提纲纲36面向对对象程序设计设计对对象和类类属性和方法组组合、子类类、派生和继继承UML设计设计UML类图类图 中的关系37UML(统统一建模语语言)类类与类类之间间的关系继继承实现实现对对象与对对象之间间的关系依赖赖 (Dependency )关联联(Association)聚合(Aggregation) 合成(Composition)UML中类类的关系继继承继继承指的是一个类类(称为为子类类、子接口)继继承另外 的一个类类(称为为父类类、父接口)的功能,并可 以增加它自己的新功能的能力;在Python中类类 定义时义时 后面括号中可加上父类类。class people:def init (self):class student(people):.38UML中类类和接口实实现现实现实现指的是一个class类实现类实现 interface接口(可以是 多个)的功能;实现实现 是类类与接口之间间最常见见的关系;Python不 支持接口,具体实现时实现时 可用类类代替;39UML对对象与对对象关
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号