《Python程序设计基础》 课件第5章 面向对象_第1页
《Python程序设计基础》 课件第5章 面向对象_第2页
《Python程序设计基础》 课件第5章 面向对象_第3页
《Python程序设计基础》 课件第5章 面向对象_第4页
《Python程序设计基础》 课件第5章 面向对象_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章

面向对象类和对象继承类的方法模块思维导图知识目标掌握掌握掌握理解类和对象的基本概念12掌握类方法的定义、调用掌握模块的自定义和导入操作4初步掌握类的继承3技能目标掌握掌握掌握熟练掌握类和对象的基础编程应用12掌握类方法的编程应用熟练掌握模块的编程应用4初步学会类继承的编程应用3思政目标

1.

理解传承与创新的关系,领会“在传承中创新,在创新中发展”含义。

2.

学习老一辈科技工作者矢志创新攻关、科技自立自强的价值追求。

3.

通过“我国第一台巨型计算机‘银河’是如何诞生的”阅读材料的学习,深刻理解二十大报告“集聚力量进行原创性引领性科技攻关,坚决打赢关键核心技术攻坚战”的内涵和意义。目录类的方法5.25.1类和对象5.3继承5.4模块知识架构5.1类和对象1类的定义2创建和使用对象3学生实践练习5.1类和对象1

类的定义

类是用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。class类名:'类的帮助信息'#类文档字符串

class_suite#类体

类的帮助信息可以通过“类名.__doc__”查看,类体class_suite由类成员、方法和数据属性组成。Python中类的特殊属性见表5.1。【语法】5.1类和对象1

类的定义

【示例5.1】定义一个Employee员工类#创建员工类classEmployee:"""属性"""name=""salary=""#构造方法def__init__(self,name,salary):"""初始化属性name和salary"""=nameself.salary=salary#定义显示员工信息的方法defdisplayEmployee(self):"""输出员工姓名和工资"""print("姓名:%s,工资:%d"%(,self.salary))5.1类和对象1

类的定义

在上述定义的员工类中,需要注意以下4点:

(1)类似“"""属性"""”格式的内容为文档字符串,文档字符串是Python程序中一个很重要的工具,一般为重要的函数描述,对理解程序文档和代码很有帮助。

(2)类中定义的函数称为方法,函数的一切特性都由方法体现,类和方法唯一的区别是方法的调用方式。

(3)__init__()方法是类的构造方法,Python中通过实现__init__()方法来初始化对象。当一个对象被创建时,Python首先需要创建一个空对象,然后为这个新对象调用__init__()方法。在员工类的__init__()方法中,包含self、name和salary三个形参,注意形参self必不可少,因为创建实例对象时,Python会自动传入实参self,让实例能够访问类中的属性和方法。因此,创建员工实例对象时,仅需传递name和salary两个参数值。5.1类和对象1

类的定义

(4)和self.salary都有前缀self,以self为前缀的变量可以供类中的所有方法使用,还可以通过实例访问这些变量。“=name”表示获取形参name值并存储到类中定义的name属性中,然后关联到当前创建的实例。

(5)员工类中还定义了显示员工信息的displayEmployee()方法,该方法不需要传递参数,因此只有一个形参self,self的作用与构造方法中的形参self作用一致。5.1类和对象2

创建和使用对象

类定义完毕之后,不能直接进行操作,因为类是抽象的概念。需要实例化类来创建类的具体对象。对象是实际的实体,每一个对象都是类的一个具体的实例。在Java语言中,使用关键字“new”来创建,而在Python中并没有这个关键字。【语法】对象名=类名([构造方法的参数])

在Python程序中,使用__init__()方法作为构造方法。通过对象名调用类中的属性或方法,需要使用“.”运算符,格式如下:(1)属性的调用,使用“对象名.属性名”。(2)方法的调用,使用“对象名.方法名([参数])”5.1类和对象2

创建和使用对象

【示例5.2】创建示例5.1中Employee员工类的对象,并调用该类中的方法。emp1=Employee("张小明",2500)#创建Employee员工对象print("员工姓名为:",)print("员工工资为:",emp1.salary)emp1.displayEmployee()#调用类中的displayEmployee方法#创建Employee员工对象emp2=Employee("",2200)="王小燕"#给对象的name属性重新赋值print("员工姓名为:",)emp2.displayEmployee()#调用类中的displayEmployee方法5.1类和对象3

学生实践练习

1.需求说明

定义一个歌曲的类,该类包含三个属性,分别为歌曲名称(name)、歌手(singer)和歌曲类型(type)。定义一个输出歌曲详细信息的方法,创建两个歌曲对象,并对歌曲对象的属性赋值,最后输出两个歌曲对象的详细信息。

2.实现思路

(1)定义一个类名为Song的歌曲类。

(2)在类中定义三个属性和一个输出歌曲详细信息的方法。

(3)创建两个歌曲对象,给对象的属性赋值,并调用输出歌曲详细信息的方法。知识架构5.2类的方法1方法的定义2方法的调用3构造方法4学生实践练习5.2类和方法1

方法的定义

在类中,方法的定义和函数的定义类似,同样以def关键字开头,后接函数标识符名称和圆括号()。不过在类中的方法必须有个附加参数self,参数self指向当前对象。class类名:def方法名(self,[参数]):方法的执行语句

例如,定义一个Phone手机类,在类中定义手机名称和打电话的方法,代码如下:【语法】classPhone:

name=""defcall(self,name):

print(name,"打电话")

在上述代码中,类的方法只定义没有被调用,因此没有结果输出。5.2类和方法2

方法的调用

类中的方法调用要使用“.”运算符,其具体格式为“对象名.方法名([参数])”。对象名.方法名([参数])

例如,调用5.2.1节中的call方法,代码如下:【语法】phone1=Phone()phone1.call("王小明")phone2=Phone()phone2.call("张飞燕")5.2类和方法3

构造方法

在类定义中有一个特殊的方法,此方法的名称为__init__,在创建对象时用于对成员变量进行初始化,此类方法被称为构造方法。在一个类中有且只能有一个构造方法,在创建对象时,对象名括号中传入的参数必须和构造函数中定义的参数保持一致。class类名:def__init__(self):构造方法的执行语句

在上述语法中,self参数必不可少,在创建对象时,会自动传入实参self。每个与类相关的方法在创建对象时,都会自动传入实参self,让实例对象能够访问类中的属性和方法【语法】5.2类和方法3

构造方法

例如,定义一个歌手类,在构造方法中对歌手名称和地区属性进行初始化,代码如下:classSinger:name=""area=""def__init__(self,name,area):=nameself.area=areasinger1=Singer("陈奕迅","中国香港")print("歌手:%s\t地区:%s"%(,singer1.area))singer2=Singer("张杰","中国")print("歌手:%s\t地区:%s"%(,singer2.area))5.2类和方法4

学生实践练习

1.需求说明

在许多系统中都有对用户的管理功能。请模拟系统的用户管理功能,分别查看用户列表、添加用户、根据ID修改用户及根据ID删除用户记录,并模拟根据用户名和密码进行登录。要求如下:(1)在控制台选择操作类型,1表示查询,2表示添加,3表示修改,4表示删除,5表示登录。(2)选择相应操作类型后,提示输入用户名和密码等信息后,实现相应的操作,运行结果如图5.5所示。5.2类和方法4

学生实践练习

5.2类和方法4

学生实践练习

2.实现思路(1)将用户信息根据编号保存在一个字典的对象中。(2)定义一个用户类,该类包含用户编号、用户名和密码3个属性,以及定义登录和显示用户信息的方法。(3)创建一个循环,输入要选择的操作类型,如果是添加用户,则创建一个用户对象并保存到字典对象中,键为随机产生的用户ID。(4)选择查询操作,则循环遍历字典的值列表,然后调用用户对象的显示用户信息的方法。(5)选择修改操作,则输入要修改的用户编号和修改后的用户名与密码,根据修改的用户编号找到用户对象,对用户对象中的用户名和密码属性重新赋值,就可以实现修改操作。5.2类和方法4

学生实践练习

(6)选择删除操作,则需要输入删除的用户编号,使用del关键字删除对应的用户对象。(7)选择登录操作,则需要输入用户名和密码,循环遍历所有用户对象,调用用户对象的登录方法进行用户登录,如果登录成功,则终止循环,提示用户登录成功。运行结果如图5.5所示。知识架构5.3继承1继承的概念2继承的使用3学生实践练习5.3

继承1

继承的概念

学习继承之前,首先看一个例子,假设定义了Person类,该类中包含名称、年龄属性和吃饭的方法。再定义了一个Student学生类,该类同样包含名称、年龄属性和吃饭的方法,除此之外,Student学生类还定义了学习的方法,代码如下:classPerson:

'''人的类'''

name=""

age=0

defeat(self):

print(,"正在吃饭")classStudent:

'''学生类'''

name=""

age=0

defeat(self):

print(,"正在吃饭")

defstudy(self):

print(,"正在学习")per1=Person()="张三"per1.eat()stu1=Student()="小明"stu1.study()

定义Person类并调用的运行结果如图5.6所示。5.3

继承1

继承的概念

上述的两个类中存在大量的重复代码,不能实现代码的复用,同时不易于程序的扩展。如果将每个类中相同的代码抽取出来建立一个公共类,提供给其他类复用,这样会大量减少重复代码,实现代码的复用。

编写类时,通过继承可大大提高代码的复用性,减少代码量,便于程序的后期维护。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法。原有的类称为父类,而新类称为子类,子类继承其父类的所有属性和方法,同时还可以定义自己的属性和方法。

继承是面向对象程序设计的一个重要特征,它通过继承原有类派生出子类,进而构造出更为复杂的子类,子类既有新定义的行为特征,又继承了原有类的行为特征。

Python中只要满足is-a的关系都可以用继承来表示。例如,老虎、狮子和熊猫都具有动物的基本特征和行为,它们都是动物;老虎、狮子和熊猫等与动物都可以形成继承的关系;小汽车、货车和公共汽车都具有车的基本特征和行为,都可以与车形成继承关系。5.3

继承2

继承的使用

实现继承的类称为子类,被继承的类称为父类,也称为基类、超类。如果一个类继承另外一个类,则需要在类定义的第一行中的类名的后面加圆括号,在圆括号中的为父类的类名。【语法】class类名(需要继承的父类名称):'''类的帮助信息'''#文档字符串class_suite#类体class_suite由类成员、方法和数据属性组成。5.3

继承2

继承的使用

1.子类的构造方法__init__()

创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。因此,子类的构造方法__init__()需要父类施以援手。

例如,创建Person类的构造方法,Student学生类继承自Person类,也定义构造方法__init__(),代码如下:classPerson:

name=""

age=0

#构造方法

def__init__(self,name,age):

=name

self.age=age

defeat(self):

print(,"正在吃饭")classStudent(Person):#继承自Person类

#子类的构造方法

def__init__(self,name,age):

super().__init__(name,age)#使用super()函数关联父类和子类5.3

继承2

继承的使用

在上述代码中,Person类是父类,Student学生类是继承自Person类的子类。Person类的构造函数__init__()定义方式与一般构造函数的定义方式相同,但是Student学生类的构造函数必须使用super()函数实现,super()函数是一个特殊的函数,它能够将父类和子类关联起来。2.子类的属性和方法

子类继承自父类后,自动具有父类的所有属性和方法,除此之外,子类还可以定义自己的属性和方法。

例如,实现Person类和Student学生类的继承关系,并在Student学生类中定义“正在学习”的方法,代码如下:5.3

继承2

继承的使用

classPerson:

name=""

age=0

#构造方法

def__init__(self,name,age):

=name

self.age=age

defeat(self):

print(,"正在吃饭")classStudent(Person):#继承自Person类

#子类的构造方法

def__init__(self,name,age):

super().__init__(name,age)#使用super()函数关联父类和子类

#子类自定义的方法

defstudy(self):

print(,"正在学习")per1=Person("张三",20)per1.eat()stu1=Student("小明",18)stu1.study()5.3

继承2

继承的使用

在Student学生类中自定义方法的运行结果如图5.7所示。

分析上述代码可知,使用继承后大量地减少了重复代码,提高了代码的复用,使程序变得更加容易维护。3.重写父类的方法

对于父类的方法,只要不符合子类的使用需求,都可以对其进行重写。重写父类某个方法时,子类应定义一个同名的方法。

例如,重写父类Person类的“正在吃饭”方法,子类Student类重写该方法为“正在吃午饭”,代码如下:5.3

继承2

继承的使用

classPerson:

name=""

age=0

#构造方法

def__init__(self,name,age):

=name

self.age=age

defeat(self):

print(,"正在吃饭")classStudent(Person):#继承自Person类

#子类的构造方法

def__init__(self,name,age):

super().__init__(name,age)#使用super()函数关联父类和子类

#子类自定义的方法

defstudy(self):

print(,"正在学习")

#重写正在吃饭的方法

defeat(self):

print(,"正在吃午饭")per1=Person("张三",20)per1.eat()stu1=Student("小明",18)stu1.eat()5.3

继承2

继承的使用

重写父类方法的运行结果如图5.8所示。5.3

继承3

学生实践练习

1.需求说明定义一个汽车类,该类包含名称和颜色两个属性及驾驶的方法。定义一个卡车类继承汽车类。定义显示汽车信息的方法。2.实现思路

(1)定义一个类名为Car的汽车类,其中包含name和color两个属性,以及名称为drive的驾驶方法。

(2)定义一个类名为Truck的卡车类。该类继承汽车类,定义一个showCarInfo的方法输出该车的信息。知识架构5.4模块1自定义模块2导入模块3学生实践练习5.4模块1

自定义模块

在计算机程序的开发过程中,随着程序代码越写越多,一个文件中的代码就会越来越长,越来越不容易维护,那么,如何解决这个问题呢?

为了编写可维护的代码,我们对很多函数进行分组,分别放到不同的文件中,这样每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称为一个模块(Module)。

模块最大的优势是,首先,大大提高了代码的可维护性;其次,编写代码不必从零开始。当一个模块编写完毕后,就可以被其他地方引用。我们在编写程序时,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

在Java语言中,使用包对各种Java文件进行分类管理,同理,Python也可以使用包管理各种模块文件,Python包的创建比较简单。在PyCharm工具中选择“New”→“PythonPackage”创建一个Python的包,创建完成后在包中就生成了__init__.py。在不使用PyCharm的情况下,可以创建一个文件夹,在文件夹中创建__init__.py,也可以产生一个Python包。

使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在于不同的模块中,因此,我们在编写模块时,不必考虑名字会与其他模块冲突,但是也要注意,尽量不要与内置函数名冲突。5.4模块1

自定义模块

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。模块的使用代码如下。(1)创建calUtils.py文件,文件代码如下:defcalMax(a,b):#计算两个数的最大数

ifa>b:

returna

returnb

(2)在工程上右键单击,在弹出的快捷菜单中选择“New”→“PythonPackage”创建一个utils目录,在该目录下创建numUtils.py文件,文件代码如下:importrandomdefconvert(str):#将字符串转换为整数

returnint(str)defgetRandomNum():#获取随机数

returnint(random.uniform(0,1000))

在上述代码中,一个Python文件表示一个模块,上述代码定义了calUtils和numUtils两个模块。5.4模块2

导入模块

在Python文件中使用同一目录下另外一个Python文件中定义的方法时,需要使用import关键字。模块名和Python文件的名称要相同。

【思考】当目录名或模块名过长,或者不太容易理解时,有没有更好的解决办法呢?1.使用import导入在导入Python模块时,可以将模块名使用语句“as别名”的方式用别名代替。【语法】import模块名[as别名]模块名(别名).方法名([参数])5.4模块2

导入模块

调用5.4.1节中的calUtils.py中的calMax()函数,代码如下:importcalUtilsprint("使用import导入:")num=calUtils.calMax(34,56)print("34和56的最大值为",num)#别名的方式importcalUtilsascalprint("使用import的别名导入:")num=cal.calMax(34,56)print("34和56的最大值为",num)使用import调用calUtils.py中的calMax()函数的运行结果如图5.10所示。5.4模块2

导入模块

2.使用from导入

有时只需要用到模块中的某个函数,只需引入该函数即可,此时可以通过语句“from模块名import函数名1,函数名2,…”实现。如果需要导入模块中的所有函数,可以使用“*”操作符表示所有函数。它的语句为“from模块名

import*”。【语法】from模块名import函数名1[as别名1],函数名2[as别名2],…fromcalUtilsimportcalMax#或者使用fromcalUtilsimport*print("使用from导入:")num=calMax(34,56)print("34和56的最大值为",num)#别名的方式fromcalUtilsimportcalMaxascalprint("使用from的别名导入:")num=cal(34,56)print("34和56的最大值为",num)

调用5.4.1节中的calUtils.py文件中的calMax()函数,代码如下:5.4模块2

导入模块

使用from调用calUtils.py文件中的calMax()函数的运行结果如图5.11所示。

当在一个Python文件中使用同一目录下另外一个目录下Python文件中定义的方法时,需要使用“from文件名import文件名”的形式。5.4模块2

导入模块

3.导入外部目录下模块导入外部目录下模块的两种方式如下。(1)第一种方式的语法。from目录名称import模块名[as别名]模块名(别名).方法名([参数])(2)第二种方式的语法。import目录名称.模块名[as别名]目录名称.模块名(别名).方法名([参数])5.4模块2

导入模块

例如,调用5.4.1节中的utils目录下numUtils.py文件中的方法,代码如下:fromutilsimportnumUtilsprint("整数转换",numUtils.convert("34"))print("随机数:",numUtils.getRandomNum())#第二种方式importutils.numUtilsprint("整数转换",utils.numUtils.convert("34"))print("随机数:",utils.numUtils.getRandomNum())#别名的方式importutils.numUtilsasnumprint("整数转换",num.convert("34"))print("随机数:",num.getRandomNum())

调用utils目录下numUtils.py文件中的方法的运行结果如图5.12所示。5.4模块3

学生实践练习

1.需求说明

实现自定义模块,要求如下:

(1)在工程目录下新建StringUtils.py文件,该文件包含一个对象转字符串的函数objToStr()。

(2)在工程目录下新建目录task,然后在task目录下新建numUtils.py文件。在该文件中定义一个NumOperator的类,在类中包含添加函数add()和求多少次方的函数pow()。

(3)新建task5-4.py文件,在该文件中使用模块导入的几种方式,调用StringUtils.py文件中的objToStr()函数及访问numUtils.py文件中NumOperator类的三个方法。5.4模块3

学生实践练习

2.实现思路

(1)在工程目录下新建StringUtils.py文件,使用系统提供的str()函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论