版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python程序设计与应用第6章面向对象程序设计6.1
类和对象6.2方法6.3
多态、继承与封装
本章小结理解Python的面向对象。掌握类、对象以及它们之间的关系。掌握类、对象的属性和方法。掌握类的组合、继承与派生。现实世界中的事物可以分为两部分:物质和意识。物质表达的是一个具体的事物,意识描述的是一个抽象的概念。例如,“这辆红色的汽车”是物质,它是具体的客观存在;“汽车”是意识,它是抽象的概念,是对具体的客观存在的一种概括。学习目标:
对象表示现实世界中某个具体事物。在现实世界中,对象无处不在。一个人、一辆汽车、一本书、一场球赛、一个银行账户等都是对象。一个对象可以非常简单,也可以非常复杂。复杂对象往往由若干简单对象组合而成。对象有一个名字,以区别于其他对象;有一组属性,用于描述对象的特征;有一组行为,用来改变对象的属性。
对象可以归类。例如,“这辆红色的汽车”是一辆汽车,“那辆白色的汽车”也是一辆汽车,则这两辆汽车是同类对象,可以归人“汽车”这个“类”。对象也称类的实例。类和对象之间的关系可以看成抽象和具体的关系。类是对现实世界中具体事物的抽象,描述了同类对象的共性。例如,“汽车”是一个描述交通工具的类,而“这辆红色的汽车”和“那辆白色的汽车”是“汽车”类的两个实例。学习目标:
面向对象程序设计追求的是对现实世界的直接模拟,将现实世界中的事物直接映射到程序的解空间。在面向对象程序设计中,现实世界中的“物质”可以对应于“对象”,现实世界中的“意识”可以对应于“类”。例如,“汽车”可以用“汽车”类来表达,“这辆红色的汽车”是“汽车”类的一个实例。
对象的属性通常用数据来表示,对象的行为通常用对数据的处理过程来表示。面向对象程序设计把数据和对数据的处理过程作为一个相互依存、不可分割的整体来看待,将数据和对数据的处理过程抽象成一种新的数据类型一类。
因此,面向对象程序的基本构造单位是类。学习目标:
6.1.1类定义语法
Python语言中一个类的实现包括类定义和类体。类定义语法格式如下:class类名[(父类)]:
类体
其中,class是声明类的关键字,“类名”是自定义的类名,自定义类名首先应该是合法的标识符,且应该遵守Python命名规范。“父类”声明当前类继承的父类,父类可以省略声明,表示直接继承object类。6.1类和对象
6.1.2对象前面章节已经多次用到了对象,类实例化可生成对象,所以“对象”也称为“实例”。一个对象的生命周期包括三个阶段:创建、使用和销毁。销毁对象时Python的垃圾回收机制释放不再使用对象的内存,不需要程序员负责。程序员只关心创建和使用对象,这一节介绍创建和使用对象。创建对象很简单,就是在类后面加上一对小括号,表示调用类的构造方法。这就创建了一个对象,示例代码如下:
animal=Animal()Animal是上一节定义的动物类,Animal()表达式创建了一个动物对象,并把创建的对象赋值给animal变量,animal是指向动物对象的一个引用。通过animal变量可以使用刚刚创建的动物对象。6.1
类和对象
6.1.3self参数对于在类体中定义的实例方法,Python会自动绑定方法的第一个参数(通常建议将该参数命名为self),第一个参数总是指向调用该方法的对象。根据第一个参数出现位置的不同,第一个参数所绑定的对象略有区别。➢在构造方法中引用该构造方法正在初始化的对象。➢在普通实例方法中引用调用该方法的对象。由于实例方法(包括构造方法)的第一个self参数会自动绑定,因此程序在调用普通实例方法、构造方法时不需要为第一个参数传值。6.1
类和对象
6.1.3self参数
self参数(自动绑定的第一个参数)最大的作用就是引用当前方法的调用者,比如前面介绍的在构造方法中通过self为该对象增加实例变量。也可以在一个实例方法中访问该类的另一个实例方法或变量。假设定义了一“个Dog类,这个Dog对象的run0方法需要调
用它的jump()方法,此时就可通过self参数作为jump()方法的调用者。
方法的第一个参数所代表的对象是不确定的,但它的类型是确定的一它所代表的只能是当前类的实例:只有当这个方法被调用时,它所代表的对象才被确定下来一谁在调用这个方法,方法的第一个参数就代表谁。注意:使用self参数作为方法的返回值可以让代码更加简洁,但可能造成实际意义的模糊。6.1
类和对象
6.1.4实例变量
在类体中可以包含类的成员,其中包括成员变量、成员方法和属性,成员变量又分为实例变量和类变量,成员方法又分为实例方法、类方法和静态方法。提示:在Python类成员中有attribute和property。attribute是类中保存数据的变量,如果需要对attribute进行封装,那么在类的外部为了访问这些attribute,往往会提供一些setter和getter访问器。setter访问器是对attribute赋值的方法,getter访问器是取attribute值的方法,这些方法在创建和调用时都比较麻烦,于是Python又提供了property,property本质上就是setter和getter访问器,是一种方法。一般情况下attribute和property中文都翻译为“属性”,这样很难区分两者的含义,也有很多书将attribute翻译为“特性”。“属性”和“特性”在中文中区别也不大。其实很多语言都有attribute和property概念,例如Objective-C中attribute称为成员变量(或字段),property称为属性。本书采用Objective-C提法将attribute翻译为“成员变量”,而property翻译为“属性”。6.1
类和对象
6.1.4实例变量
“实例变量”就是某个实例(或对象)个体特有的“数据”,例如你家狗狗的名字、年龄和性别与邻居家狗狗的名字、年龄和性别是不同的。
6.1.5类变量
“类变量”是所有实例(或对象)共有的变量。例如有一个Account(银行账户)类,它有三个成员变量:amount(账户金额)、interest_rate(利率)和owner(账户名)。在这三个成员变量中,amount和owner会因人而异,对于不同的账户这些内容是不同的,而所有账户的interest_rate都是相同的。amount和owner成员变量与账户个体实例有关,称为“实例变量”,interest_rate成员变量与个体实例无关,或者说是所有账户实例共享的,这种变量称为“类变量”。
6.1
类和对象
在6.1.4节和6.1.5节中都使用了_init_()方法,该方法用来创建和初始化实例变量,这种方法就是“构造方法”。_init_()方法也属于魔法方法。定义时它的第一个参数应该是self,其后的参数才是用来初始化实例变量的。调用构造方法时不需要传入self。6.2.1类方法
“类方法”与“类变量”类似属于类,不属于个体实例的方法,类方法不需要与实例绑定,但需要与类绑定,定义时它的第一个参数不是self,而是类的type实例。type是描述Python数据类型的类,Python中所有数据类型都是type的一个实例。6.2方法6.2.2实例方法
实例方法与实例变量一样都是某个实例(或对象)个体特有的。本节先介绍实例方法。方法是在类中定义的函数。而定义实例方法时它的第一个参数也应该是self,这个过程是将当前实例与该方法绑定起来,使该方法成为实例方法。6.2.3静态方法
如果定义的方法既不想与实例绑定,也不想与类绑定,只是想把类作为它的命名空间,那么可以定义静态方法。
类方法与静态方法在很多场景是类似的,只是在定义时有一些区别。类方法需要绑定类,静态方法不需要绑定类,静态方法与类的耦合度更加松散。在一个类中定义静态方法只是为了提供一个基于类名的命名空间。6.2方法
6.3.1封装封装性是面向对象的三大特性之一,Python语言没有与封装性相关的关键字,它通过特定的名称实现对变量和方法的封装。私有变量:默认情况下Python中的变量是公有的,可以在类的外部访问它们。如果想让它们成为私有变量,可以在变量前加上双下画线“__”提示:Python中并没有严格意义上的封装,所谓的私有变量只是形式上的限制。如果想在类的外部访问这些私有变量也是可以的,这些双下画线“_”开头的私有变量其实只是换了一个名字,它们的命名规律为“_类名_变量”。Python的封装性靠的是程序员的自律,而非强制性的语法。私有方法:私有方法与私有变量的封装是类似的,只要在方法前加上双下画线“__”就是私有方法了。6.3多态、继承与封装
6.3.1封装定义属性:封装通常是对成员变量进行的封装。在严格意义上的面向对象设计中,一个类是不应该有公有的实例成员变量的,这些实例成员变量应该被设计为私有的,然后通过公有的setter和getter访问器访问。访问器形式的封装需要一个私有变量,需要提供getter访问器和一个setter访问器,只读变量不用提供setter访问器。总之,访问器形式的封装在编写代码时比较麻烦。为了解决这个问题,Python中提供了属性(property),定义属性可以使用@property和@属性名.setter装饰器,@property用来修饰getter访问器,@属性名.setter用来修饰setter访问器。提示:定义属性时应该先定义getter访问器,再定义setter访问器,即代码第①行和第②行不能颠倒,否则会出现错误。这是因为@property修饰getter访问器时,定义了weight属性,这样在后面使用@weight.setter装饰器才是合法的。6.3多态、继承与封装
6.3.2继承类的继承性是面向对象语言的基本特性,多态性的前提是继承性。多继承:所谓多继承,就是一个子类有多个父类。大部分计算语言如Java、Swift等,只支持单继承,不支持多继承。主要是多继承会发生方法冲突。例如,客轮是轮船也是交通工具,客轮的父类是轮船和交通工具,如果两个父类都定义了run()方法,子类客轮继承哪一个run()方法呢?Python支持多继承,但Python给出了解决方法名字冲突的方案。这个方案是,当子类实例调用一个方法时,先从子类中查找,如果没有找到则查找父类。父类的查找顺序是按照子类声明的父类列表从左到右查找,如果没有找到再找父类的父类,依次查找下去。6.3多态、继承与封装
6.3.3多态在面向对象程序设计中,多态是一个非常重要的特性,理解多态有利于进行面向对象的分析与设计。发生多态要有两个前提条件:第一、继承——多态发生一定是子类和父类之间;第二、重写——子类重写了父类的方法。提示:与Java等静态语言相比,多态性对于动态语言Python而言意义不大。多态性优势在于运行期动态特性。例如在Java中多态性是指,编译期声明变量是父类的类型,在运行期确定变量所引用的实例。而Python不需要声明变量的类型,没有编译,直接由解释器运行,运行期确定变量所引用的实例。6.3多态、继承与封装
6.3.3多态类型检查:无论多态性对Python影响多大,Python作为面向对象的语言多态性是存在的,这一点可以通过运行期类型检查证实,运行期类型检查使用isinstance(object,classinfo)函数,它可以检查object实例是否由classinfo类或classinfo子类所创建的实例。鸭子类型:多态性对于动态语言意义不是很大,在动态语言中有一种类型检查称为“鸭子类型”,即一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子,那它就可以被当作鸭子。鸭子类型不关注变量的类型,而是关注变量具有的方法。鸭子类型像多态一样工作,但是没有继承,只要像“鸭子”一样的行为(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通信网络基础验收检测卷含完整答案
- 危重患儿呼吸机应用
- 护理授课大赛教学评估
- 微生态调节剂临床应用共识2026
- 剖宫产后疼痛缓解技巧
- 护理不良事件的预防与管理最佳案例
- 多发伤患者并发症护理常规
- 心外科患者SwanGanz导管应用与护理
- 冠心病患者活动能力评估的注意事项
- 分级护理操作指南培训
- 2026年广东佛山警务辅助人员招聘考试试卷-含答案解析
- 家禽疫病防控技术培训
- 2026年燃气安全生产管理人员企业主要负责人理论考试题库(含答案)
- 必修下文言文知识清单(实词+虚词+句式+翻译)
- 电影进校园实施方案
- 2026年山东省东营广饶县事业单位招聘(124人)易考易错模拟试题(共500题)试卷后附参考答案
- 赖氨酸磷酸氢钙颗粒培训
- 2024年山东济南水务集团有限公司招聘笔试参考题库含答案解析
- 羊场承包合同范本
- 乘用车内部凸出物法规培训课件
- 驾考三力测试模拟题含答案
评论
0/150
提交评论