Python编程基础-第7章-面向对象程序设计.ppt
《Python编程基础-第7章-面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《Python编程基础-第7章-面向对象程序设计.ppt(94页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 厦门大学计算机科学与技术系 2022年第7章 面向对象程序设计http:/ 博士博士/副教授副教授厦门大学计算机科学与技术系厦门大学计算机科学与技术系E-mail: 主页:主页:http:/ 厦门大学计算机科学与技术系 林子雨 主讲教师主讲教师:厦门大学 林子雨 博士/副教授中国高校首个“数字教师数字教师”提出者和建设者2009年7月从事教师职业以来累计免费免费网络发布超过1500万字高价值教学和科研资料网络浏览量超过1500万次2017年度厦门大学奖教金获得者2020年度厦门大学奖教金获得者Python程序设计基础教
2、程(微课版) 厦门大学计算机科学与技术系 林子雨 第7章 面向对象程序设计7.1 面向对象编程概述7.2 Python中的面向对象7.3 自定义类7.4 成员的可见性7.5 方法7.6 类的继承7.7 本章小结 Python程序设计基础教程(微课版) 教材官方网站:http:/ 厦门大学 林子雨,赵江声,陶继平 编著,人民邮电出版社Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.1 面向对象编程概述7.1.1 对象与类7.1.2 继承与多态 Python程序设计基础教程(微课版) 教材官方网站:http:/ 厦门大学 林子雨,赵江声,陶继平 编著,人民邮电出版社
3、Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.1.1 对象与类面向对象编程的核心概念是对象。在我们的自然语言里,对象是对客观存在事物的一个统称。不同的对象之间相互依存但边界清晰。在计算机程序世界里,对象是建立在数据和基于数据的操作之上的实体。对象之间逻辑边界清晰,在对象之外,整个程序就是各种对象的生成、调用、交互与销毁的过程。通过对象的概念,将数据和业务逻辑细节进行合适的隐藏,只对外提供一些访问接口,用户无需知道对象内部实现的细节,但可以通过该对象对外提供的接口与对象进行安全有效的交互。这个过程称为“封装”,它使得程序的组织更加清晰,可读性更强,同时可扩展性更
4、好。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.1.1 对象与类与对象紧密相关的一个概念是“类”。类是对不同对象的共同属性和共同行为特征的抽象。作为一种抽象的数据类型,类定义了对象所具有的静态特征和动态行为。在面向对象的术语里,一般将静态特征称为“属性”,将动态行为称为“方法”。例如,在模拟人生这个游戏里,可以定义一个“建筑工”类来建模现实世界的建筑工人,它可能包括姓名、年龄及身高等属性,同时还具有“走路”、“跑步”及“搬砖”等方法。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.1.1 对象与类通俗地说,类是用来创建对象的蓝
5、图或模板。通过类这个模板,可以制造出一个个具体的对象,这些对象称为“类的实例”(instance),这个过程称为“实例化”(instantiation)。从同一个类实例化出的对象具有相同的属性和方法,但属性的取值可能不同,方法的执行结果也可能不同。例如,通过前面定义的“建筑工”类可以实例化出张三、李四等具体的建筑工实例,但他们的年龄身高等属性值可能不一样,走路的快慢和搬砖的能力也可能不一样。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.1.2 继承与多态一个系统的多个类通常是存在功能上的纵向层级关系的,也就是说,一种类型可能是另一种类型的一种扩展或者特殊化。因
6、此,为了提高代码的复用性,可以将两个类型所共有的功能抽象为一个上层类型,而将扩展的功能抽象为一个下层类型。在面向对象的编程术语里,用继承来表示这种类型之间的层级关系。继承是通过已存在的类来建立新类的技术,已存在的类称为“父类”或“基类”,新类称为“子类”或“派生类”。新类不仅继承了父类的属性和方法,还可以增加新的属性和方法。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.1.2 继承与多态通俗地说,继承所描述的是一种从属关系,如果有两个类型A和B可以描述为“B是A”,则可以表示为B继承A。例如,如果有一个“动物”类和“狗”类,因为“狗是动物”,所以可以表示为“狗
7、”类继承“动物”类。继承所表示的从属关系具有传递性,如果B继承A,C继承B,那么也可以说C继承A。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.1.2 继承与多态子类在继承父类时,除了可以原封不动地继承父类的方法,还可以修改父类的方法,这个过程称为“重写”(override)。基于这一原则,经常将一些具有类似功能但实现细节不是完全一致的方法抽象到父类中,父类只描述这种方法的对外输入输出功能,而不给出具体的实现,这种方法称为“抽象方法”,包含这种方法的类称为“抽象类”。当从抽象类派生子类时,子类需要根据具体的场景实现父类中定义的抽象方法,不同的子类给出的具体实现
8、可能不一样。例如,假设“动物”类具有一个“发出叫声”的方法,但不同的动物发出的叫声可能不一样,“狗”这个子类是旺旺叫,“猫”子类是喵喵叫。这种同一个方法具有不同实现的特征,称为“多态”(Polymorphism)。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.1.2 继承与多态多态使得程序的灵活性或可扩展性更好。例如,假设有一个“动物”类型的数组,可以遍历数组统一调用“发出叫声”这个方法,而不需要考虑实际运行时这个数组包含的是“狗”类型的对象还是“猫”类型的对象,多态行为保证了“发出叫声”会自动动态绑定到“狗”或者“猫”的“发出叫声”方法,即使后续增加了一个新
9、的“鸭子”子类对象,它也会自动发出呱呱叫,而无需修改原来的调用代码。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.2 Python中的面向对象中的面向对象7.2.1 对象7.2.2 类 Python程序设计基础教程(微课版) 教材官方网站:http:/ 厦门大学 林子雨,赵江声,陶继平 编著,人民邮电出版社Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.2.1 对象每个对象可以有多个变量名,但只有一个唯一的整数值身份号(identity),可以使用内置函数id()来查看对象的身份号。一个对象一旦被创建,身份号就保持不变。Pyth
10、on采用引用计数技术自动管理对象所占用内存的回收,一般来说,用户不需要关注该过程。可以用is操作符检查两个对象是否是同一个对象,也就是身份号是否相等。如果对象所包含的值不能改变,则称为“不可变对象”,反之,如果所包含的值可以改变,则称为“可变对象”。前面章节已经学过的int、float等数值类型的值都是不可变对象,而列表、集合等值都是可变对象。值得一提的是,当可变对象有多个引用名时,通过一个引用名对对象的修改,对另一个引用名而言也是可见的,因为它们操作的是同一个对象。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.2.1 对象举例如下: a = 34 b = a
11、 # a和b是同一个对象34的不同名字,二者都指向对象34 b = 45 #将名字b重新指派给了对象45(并不是改变b指向对象的值,因为b指向的是不可变对象) a # a指向的对象保持不变34 a is b # a和b已经指向不同的对象了False c = 1,2,3 d = c #c,d是同一个列表对象1,2,3的不同名字,并没有创建了一个新对象 d0 = 100 #通过名字d修改了列表对象 c # c和d指向的还是同一个对象100, 2, 3 c is dTruePython程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.2.1 对象Python用关键字None表示空对
12、象。没有显式返回值的函数都默认返回None对象。对于一个给定的对象,可以用“.”运算符调用其属性或方法,使用内置函数dir()可以查看对象所支持的所有属性与方法,该函数将对象的所有属性名和方法名以一个列表的形式返回。实例如下: a = 12 dir(a) #查看整数对象的属性与方法,下面省略了部分返回内容_abs_, _add_, _and_, _bool_, _ceil_, _class_, _delattr_, _dir_, _divmod_, _doc_, bit_length, conjugate, denominator, from_bytes, imag, numerator, r
13、eal, to_bytes a.bit_length() #调用对象的bit_length()方法,该方法返回整数的二进制位数4 dir(hello) #查看字符串对象的属性与方法,下面省略了部分返回内容_add_, _class_, _contains_, _delattr_, _dir_, _doc_, _eq_, _format_, _ge_, _getattribute_, rpartition, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfillP
14、ython程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.2.2 类Python将所有对象分成了不同的类别,这个类别就称为对象所属的“类”,或称为“类型”。Python有很多内置的类型,每一个类型都有一个名称,例如在前面章节已经学过的int、float等数值类型以及列表、集合等序列类型。有了类型的概念,就可以用类型来实例化出一个该类型的具体对象,相应的语法为“类型名(参数列表)”。可以使用内置函数type()来查看一个对象所属的类型。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.2.2 类举例如下: i = int(123) #通过类型名i
15、nt实例化对象,等效于i = 123 type(i) #type()函数返回对象所属的类型对象 # i属于int类,表示整数类型 type(Hello World) # Hello World属于str类,表示字符串类型 type(7,8,9) # 7,8,9属于list类,表示列表类型 def fun(): print(Hello World) type(fun) # fun属于函数类型Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.2.2 类既然Python里一切都是对象,那么对象所属的类型本身也是对象,例如上面提到的int、str、list及functio
16、n等,都是对象。既然是对象,那也就有相应的类型。在Python里,所有的类型对象都属于名为type的类型。举例如下: type(int) type(str) type(list) type(type(fun)Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.2.2 类需要指出的是,Python的官方文档中关于“类型”有两个对应的词,分别是“class”和“type”。在Python 3中,当表示类型这个概念时,这两个词之间可以互换使用;当分别作为自定义类的关键字和类型对象所属的类名时,不能互换。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林
17、子雨 7.2.2 类Python具有丰富的内建类型系统。简要概括起来,可以分为三大类别。第一类是用于表示数据的内建类型,例如int、str等基本数据类型以及诸如list及set等序列类型;第二类是用于表示程序结构的内建类型,例如函数对象的类型、type类型,还有后文将提到的object类型(表示所有类型的默认父类型);第三类是用于表示Python解释器内部相关操作的类型,例如,types.TracebackType表示的是异常出现时的回溯对象的类型,它记录了异常发生时的堆栈调用等信息。对于大部分使用者而言,我们使用最多的就是表示数据的第一类内建类型。Python程序设计基础教程(微课版) 厦门
18、大学计算机科学与技术系 林子雨 7.3 自定义类自定义类7.3.1 类的定义与实例化类的定义与实例化7.3.2 构造器构造器7.3.3 类属性与实例属性类属性与实例属性 Python程序设计基础教程(微课版) 教材官方网站:http:/ 厦门大学 林子雨,赵江声,陶继平 编著,人民邮电出版社Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.3.1 类的定义与实例化类的定义与实例化像大多数高级语言一样,Python使用关键词class来定义一个类。基本语法如下:class 类名: 类文档字符串 类的实现Python程序设计基础教程(微课版) 厦门大学计算机科学与技术
19、系 林子雨 7.3.1 类的定义与实例化类的定义与实例化对于类的定义,有如下规定:类名必须是一个合法的Python标识符,且按照Python的编码规范,类名的首字母要求大写。当然,也可以根据自己或团队的代码规范来命名,基本原则是保证项目的代码规范一致性。类的文档字符串是位于类体最前面的、一个由三引号包括起来的字符串,作为类的帮助文档。定义好后可以使用类的_doc_属性来获取该字符串。在一些集成开发环境中,在实例化类时会自动提示这个文档字符串。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.3.1 类的定义与实例化类的定义与实例化类的实现部分包括属性和方法的定义。
20、类实现部分的每一条定义语句相对class关键字都必须有相同的缩进。类属性的定义就是将变量的定义移到类的内部,只需要给出相应的变量名和初始值。方法的定义语法与函数一样,也是使用def关键字,相当于定义在类里面的函数。但是,与类外的函数不同的是,类方法的第一个参数都是指向调用者实例的引用,在定义时一般都习惯用self作为参数名(也可以使用其它标识符作为参数名)。属性和方法统称为类的成员。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.3.1 类的定义与实例化类的定义与实例化下面是一个简单的自定义类:01 class MyFirstClass:02 A simple
21、example class03 state = 1234504 def fun(self):05 return Hello World上面的实例代码定义了一个名为MyFirstClass的类,它包含了一个属性state和一个方法fun()。定义了一个类后,就可以使用类名加括号的形式生成一个该类的对象。一旦实例化成功后,相应的实例可以使用“.”操作符来访问类的成员。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.3.1 类的定义与实例化类的定义与实例化下面的例子中,首先实例化了一个名为c的MyFirstClass类型的对象,然后依次访问了属性state和方法fun
22、()。在方法的访问中,不需要提供第一个self参数,相应的调用者对象c自动被绑定到了self。 MyFirstClass._doc_ #返回类的文档字符串A simple example class c = MyFirstClass () #实例化对象 c.state12345 c.fun()Hello WorldPython程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.3.1 类的定义与实例化类的定义与实例化在类的内部,成员之间的相互访问也需要使用“.”操作符,而不能直接用成员名进行访问。举例如下: class MyTestClass: value = 456 def
23、fun1(self): print(My value is , self.value) #不能省略self直接访问value def fun2(self): fun1() #执行时将出现NameError a = MyTestClass() a.fun1()My value is 456 a.fun2()Traceback (most recent call last): File , line 1, in File , line 7, in fun2NameError: name fun1 is not definedPython程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨
24、 7.3.2 构造器当实例化一个类时,Python会自动调用一个名为“_new_”的方法,创建一个最原始的对象,该方法继承自父类object。有了这个原始对象后,再使用该对象调用一个名为“_init_”的特殊方法进行对象的初始化。这些方法并不需要由用户显式调用,而是在实例化类时自动被调用,称为“类的构造器(constructor)方法”。在实际应用中,用户一般不需要重写“_new_”方法,只需要重新实现“_init_”方法来执行一些具体的初始化操作。Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.3.2 构造器“_init_”方法可以有参数,这些参数将在实例化时
25、被提供,当然也可以像普通函数一样,给这些参数提供默认值。实例化时只需要将相应的值放在类名后的括号里面。例如: class Student: def _init_(self,name=无名氏): print(开始实例化一个Student对象,名为,name) a = Student(张三) 开始实例化一个Student对象,名为张三 b = Student()开始实例化一个Student对象,名为无名氏Python程序设计基础教程(微课版) 厦门大学计算机科学与技术系 林子雨 7.3.3 类属性与实例属性类属性与实例属性Python的类定义里有两种属性,分别称为“类属性”和“实例属性”。类属性在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 编程 基础 面向 对象 程序设计
限制150内