Python项目开发教程 课件 第七章 面向对象程序设计_第1页
Python项目开发教程 课件 第七章 面向对象程序设计_第2页
Python项目开发教程 课件 第七章 面向对象程序设计_第3页
Python项目开发教程 课件 第七章 面向对象程序设计_第4页
Python项目开发教程 课件 第七章 面向对象程序设计_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

Python项目开发实用教程第七章:面向对象程序设计类与对象基础定义类、实例化对象、构造方法与析构方法继承与多态单继承与多继承、方法重写、多态特性实现类成员进阶类属性与实例属性、静态方法与类方法目录7.1面向对象基础面向对象的定义与核心思想对象和类的基本概念面向对象程序设计的特点7.2类与对象的定义类的定义语法与结构对象的实例化过程类与对象的关系解析7.3类成员详解属性与方法的定义与访问构造方法与初始化析构方法与资源释放7.4继承与多态继承的定义与实现示例方法重写的机制与应用多态性的概念与实践总结与实践本章知识小结与习题练习项目实践:学生成绩管理系统思政小故事科技伦理与代码规范面向对象思想的哲学思考7.1面向对象基本概念理解面向对象的核心思想与定义对象与类掌握对象实例化与类的封装特性设计特点深入分析封装、继承与多态特性面向对象的定义核心编程思想面向对象是一种编程范式,它将现实世界中的事物抽象为程序中的对象,以对象为基本单位构建系统。封装数据与方法将数据(属性)和操作数据的方法(行为)封装在一起,隐藏内部细节,只对外暴露必要的接口。对象交互协作程序的功能通过对象之间的消息传递和交互来完成。对象和类的概念实例与模板对象是类的实例,类是对象的模板。这是面向对象编程中最核心的逻辑关系。定义与实现类定义了对象的属性(数据)和方法(行为),而对象则是这些定义的具体实现和载体。面向对象程序设计的特点封装(Encapsulation)将数据和操作数据的方法封装在一起,隐藏内部细节,只对外暴露必要的接口。继承(Inheritance)一个类可以继承另一个类的属性和方法,实现代码的复用和扩展,建立类之间的层次关系。多态(Polymorphism)同一个方法在不同的对象上有不同的表现形式,提高了程序的灵活性和扩展性。7.2类与对象的定义面向对象程序设计的核心基石类的定义使用Class关键字在编程中,我们使用class关键字来定义一个类,这是面向对象编程的基础语法。大驼峰命名法类名通常采用大驼峰命名法(UpperCamelCase),即每个单词的首字母大写,例如:MyClass。类的定义语法class类名:

成员变量1

成员变量2…

成员方法1

成员方法2…类的定义示例#类的定义classMen: age=18#成员变量 defsay(self):#成员方法 print(“hello”);核心语法解析class关键字使用class关键字来声明一个类,这是面向对象编程的基础。类名命名类名通常采用大驼峰命名法(PascalCase),如示例中的Men。成员方法定义了一个成员方法say,其作用是输出字符串"hello"。类的定义注意事项

(1)成员方法(成员函数):在Python语言中,普通的函数与类的成员方法(成员函数)是有所区别的。成员方法通常与特定的实例绑定,当通过对象调用成员方法时,对象本身会作为第一个参数自动传递给该方法,而普通的函数则不具备这个特性。

(2)self参数

:在上述例子中,成员方法say()中包含一个参数self。这是类的成员方法(成员函数)与普通函数的一个显著区别。在类的成员方法中,必须有一个名为self的参数,并且它必须位于参数列表的开头。self代表的是类的实例对象,而不是类本身。

程序可以通过self参数来引用类的成员变量(属性)和成员方法(成员函数)。在类的成员方法中访问实例属性时,需要以self为前缀。然而,在类的外部通过对象名调用成员方法时,不需要显式地传递这个self参数。如果在类的外部通过类名调用成员方法(这通常不是推荐的做法,因为需要手动传递实例对象作为self参数),则需要显式地传递一个实例对象作为self参数的值。对象的定义对象的创建方式在编程中,通常使用类名加括号的方式来创建对象。这是一种标准化的实例化过程,确保对象继承了类的属性和方法。对象的本质属性对象是类的实例。类定义了抽象的蓝图,而对象则是根据这个蓝图在内存中创建的具体实体,包含了实际的数据和行为。对象调用类成员的语法格式如下:对象名.成员变量或对象名.成员方法()定义对象语法格式如下:对象名=类名()对象的定义示例#类的定义classmen: age=18#成员变量 defsay(self):#成员方法 print("人生自古谁无死,留取丹心照汗青。");#对象的定义m=men()m.say()#通过对象调用成员方法1.定义类(ClassDefinition)使用class关键字定义一个名为men的类,它是对象的蓝图。2.执行结果人生自古谁无死,留取丹心照汗青。7.3类成员属性(Attributes)属性是类的静态特征,用于描述对象的状态。它们是类中定义的变量,代表了对象所拥有的数据。方法(Methods)方法是类的动态行为,用于定义对象的功能。它们是类中定义的函数,代表了对象可以执行的操作。属性的定义核心定义

属性是指类的变量,它用于存储对象的状态。在面向对象编程中,属性定义了对象的特征和数据结构。本质:类的变量作为类的成员变量,属性构成了对象的基本数据结构。作用:存储状态负责保存对象在特定时刻的状态信息,是数据的载体。属性的定义示例classPerson:def__init__(self,name,age):=nameself.age=age类定义(ClassDefinition)使用class关键字定义一个名为Person的类,作为对象的蓝图。初始化方法(__init__)构造方法用于初始化对象,self代表类的实例本身。属性定义(Attribute)将参数name和age赋值给实例属性,实现数据封装。方法的定义核心概念解析方法是指类的函数,它用于实现对象的行为。在面向对象编程中,方法是类的重要组成部分,通过定义方法,我们可以封装对象的具体操作逻辑,实现代码的复用与模块化。方法的定义示例classPerson:def__init__(self,name,age):=nameself.age=age

defintroduce(self):print(f"Mynameis{},Iam{self.age}yearsold.")类定义(ClassDefinition)定义了一个名为Person的类,作为对象的蓝图,封装了属性和行为。构造方法(__init__)初始化对象时自动调用,用于为对象设置初始属性(如姓名和年龄)。自定义方法(introduce)定义了对象的行为,用于输出个人信息,展示了方法如何访问对象属性。构造方法核心概念定义初始化对象属性构造方法是创建对象时自动调用的特殊方法,主要用于初始化对象的状态和属性。特殊命名规则在Python中,构造方法的名称固定为__init__,前后各有两个下划线。构造方法示例一School.pyclassSchool:#这种方式就定义了一个类,以下方法可以调用这个类'''定义一个学校类''' def__init__(self): print('这里是__init()__方法') def__judge__(self): print('判断这个方法是否被调用')school=School()类定义(ClassDefinition)使用class关键字定义了一个名为School的类,这是面向对象编程的基础结构。构造方法(__init__)__init__是Python的构造方法,用于初始化对象属性。参数self代表实例本身。构造方法示例二GetAge.pyclassGetAge: def__init__(self,name,age): =name self.age=age print('%s的年龄为%d'%(name,age))GetAge('小明',18)类定义(ClassDefinition)使用class关键字定义了一个名为GetAge的类,这是面向对象编程的基础结构。构造方法(__init__)__init__是Python的构造方法,用于初始化对象属性。第一个参数self代表实例本身,后续参数用于传递数据。。析构方法核心概念资源释放机制析构方法是对象生命周期的最后一环,主要用于释放对象占用的系统资源(如文件句柄、网络连接等)。在Python中,析构方法的固定名称为:__del__析构方法示例classSchool:#这种方式就定义了一个类,以下方法可以调用这个类 '''定义一个学校类''' def__init__(self): print('这里是__init()__方法') def__judge__(self): print('判断这个方法是否被调用') def__del__(self):print('School类不存在了')school=School()注意:在实际运行中,__del__()方法的调用时机由Python的垃圾回收机制决定,因此可能不会立即看到输出结果。类成员方法与访问限制classLibrary: def__init__(self,name,id,age): =name self.id=id self.age=age defborrow(self,bookname): self.bookname=bookname print('%s借阅了书籍--%s'%(,self.bookname)) print('借阅者学号为%d,年龄为%s'%(self.id,self.age)) print('借书成功!')xiaoming=Library('小明',1001,20)xiaoming.borrow('Python教程')执行结果:小明借阅了书籍--Python教程借阅者学号为1001,年龄为20借书成功!成员方法应用:类方法的分类与访问限制:在Python语言中,类的成员方法基本可以分为三大类

:公有方法、私有方法和静态方法。(1)公有方法

:公有方法属于对象,可以通过对象名直接调用类的成员。(2)私有方法:私有方法也属于对象,但其名字通常以两个下划线开头。私有方法不能用对象名直接调用,只能在方法中通过self调用,或在外部通过一些Python支持的方法(如_类名__方法名)来调用。(3)静态方法

:静态方法可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。静态方法通常使用@staticmethod装饰器来定义。

如果通过类名来调用属于对象的公有方法,需要显式地为该方法的self参数传递一个对象名,以明确指定要访问哪一个对象的成员。

对单下划线、双下划线、头尾双下划线的说明

:(1)单下划线

:以单下划线开头的变量(如_foo)表示的是保护类型(protected)的变量,即保护类型只能允许其本身与子类进行访问,不能用于frommoduleimport*。(2)双下划线:以双下划线开头的变量(如__foo)或方法(如__foo())表示的是私有类型(private)的变量或方法,只能是允许这个类本身进行访问。(3)头尾双下划线

:以头尾双下划线定义的变量或方法(如__init__())表示的是特殊方法,一般是系统定义的名字。7.4继承、重写和多态继承(Inheritance)代码复用与扩展的基石重写(Override)子类对父类方法的个性化实现多态(Polymorphism)同一接口,不同表现形式继承的定义核心概念解析继承是面向对象编程的核心机制之一,指一个类可以获取另一个类的属性和方法,从而实现代码复用。父类(ParentClass)被继承的类,也称为基类或超类,是属性和方法的来源。子类(ChildClass)继承的类,也称为派生类,继承父类特征并可扩展新功能。继承关系示意图继承的语法格式class子类名(父类名)#子类的属性和方法...继承的示例Python代码实现classBase:#定义一个名为Base的父类 def__init__(self,name,age,id): =name self.age=age self.id=id print('继承了Base这个类') print('我的名字:',) print('我的年龄:',self.age) print('我的学号:',self.id) defgoto_school(self): print(,'正在使用Base类中的goto_school()方法去上学')classStudent(Base):#继承父类的时候会继承父类中的所有方法 passxiaoming=Student('小明',20,1001)xiaoming.goto_school()类继承关系Student类继承自Base类,这意味着Student自动拥有了Base的属性和方法。执行结果继承了Base这个类我的名字:小明我的年龄:20我的学号:1001小明正在使用Base类中的goto_school方法去上学多重继承的语法格式class子类名(父类名1[,父类名2,...]): #子类的属性和方法 ...多重继承的示例Python代码实现classParent:#定义父类 parentAttr=100 def__init__(self): print"调用父类构造函数" defparentMethod(self): print'调用父类方法' defsetAttr(self,attr): Parent.parentAttr=attr defgetAttr(self): print"父类属性:",Parent.parentAttrclassChild(Parent):#定义子类 def__init__(self): print"调用子类构造方法" defchildMethod(self): print'调用子类方法'c=Child()#实例化子类c.childMethod()#调用子类的方法c.parentMethod()#调用父类方法c.setAttr(200)#再次调用父类的方法-设置属性值c.getAttr()#再次调用父类的方法-获取属性值类继承关系Child类继承自Parent类,这意味着Child自动拥有了Parent的属性和方法。执行结果调用子类构造方法调用子类方法调用父类方法父类属性:200重写的定义核心机制:子类继承与扩展重写(Override)是面向对象编程中的一个关键特性。它允许子类重新定义父类中已有的方法,从而实现对父类行为的扩展或修改。行为结果:覆盖与替代当子类重写父类方法后,调用该方法时,系统会优先执行子类中重写的版本,从而覆盖(Override)掉父类原有的方法实现。重写的示例classPerson:def__init__(self,name,age):=nameself.age=agedefintroduce(self):print(f"Mynameis{}...")classStudent(Person):def__init__(self,name,age,id):super().__init__(name,age)self.id=iddefintroduce(self):print(f"Mynameis{},id:{self.id}")基类定义(Person)首先定义了一个基础的Person类,包含初始化方法和introduce方法,用于输出基本信息。子类重写(Student)Student类继承自Person,并重新定义了introduce方法,增加了student_id属性的输出,实现了方法的重写。多态的定义核心概念多态(Polymorphism)是面向对象编程的核心特性之一。它指的是同一个方法调用在不同的对象实例上会产生不同的执行结果。

主要优势:提高代码的灵活性,降低耦合度增强程序的可扩展性,便于维护图示:多态概念示意图多态的示例classPerson:def__init__(self,name,age):=nameself.age=agedefintroduce(self):print(f"Mynameis{}...")classStudent(Person):def__init__(self,name,age,student_id):super().__init__(name,age)self.student_id=student_iddefintroduce(self):print(f"Myidis{self.student_id}")classTeacher(Person):def__init__(self,name,age,subject):super().__init__(name,age)self.subject=subjectdefintroduce(self):print(f"Iteach{self.subject}")#多态:统一接口,不同实现defintroduce_person(person):roduce()定义基类与子类创建Person基类,Student和Teacher子类继承并重写了introduce方法。统一接口调用定义introduce_person函数,接收Person类型参数,统一调用introduce方法。运行时动态绑定当传入不同对象(Person/Student/Teacher)时,程序会自动调用对应类的方法。本章小结:面向对象程序设计面向对象核心思想将数据和操作数据的方法封装在一起,以对象为基本单位,通过对象交互完成功能,实现高内聚低耦合。类与对象的定义使用class关键字定义类(蓝图),通过类名加括号的方式创建具体对象(实例),是程序实现的基础。类成员构成属性(Attribute)存储对象的状态数据,方法(Method)实现对象的行为逻辑,二者共同构成了对象的完整特征。继承、重写与多态继承实现代码复用,重写允许子类定制父类行为,多态则保证了同一接口在不同实例上的不同表现形式。习题-选择题(1)1.面向对象程序设计的特点不包括?A.封装B.继承C.多态D.过程化正确答案答案:D解析面向对象程序设计的特点包括封装、继承和多态,过程化是面向过程程序设计的特点。习题-选择题(2)2.用于定义类的关键字是?A.classB.defC.funcD.function答案:A解析:用于定义类的关键字是class。在Python中,def用于定义函数,而func和function并不是Python的关键字。习题-选择题(3)3.用于表示继承关系的符号是?A.:B.->C.<-D.=答案与解析答案:A解析:用于表示继承关系的符号是冒号(:)。在面向对象编程中,子类通常通过冒号来继承父类的属性和方法。习题-选择题(4)4.多态是指?A.同一个方法在不同的对象上有不同的表现形式B.子类可以继承父类的属性和方法C.将数据和操作数据的方法封装在一起D.子类可以重写父类的方法答案:A|解析:多态是指同一个方法在不同的对象上有不同的表现形式。习题-编程题(1)题目要求定义一个名为“Person”的类类中包含属性:name(姓名)和age(年龄)实现方法:introduce(),用于格式化输出个人信息示例代码(Python)classPerson:def__init__(self,name,age):=nameself.age=agedefintroduce(self):print(f"Mynameis{}")print(f"Iam{self.age}yearsold")习题-编程题(2)题目要求:定义一个名为“Student”的类,该类继承自“Person”类,包含属性student_id,以及方法introduce,用于输出学生信息。Python示例代码classStudent(Person):def__init__(self,name,age,student_id):super().__init__(name,age)self.student_id=student_iddefintroduce(self):print(f"Mynameis{},Iam{self.age}yearsold,Myidis{self.student_id}")习题-编程题(3)题目要求:定义一个名为“Teacher”的类,该类继承自“Person”类,包含属性subject,以及方法introduce,用于输出教师信息。Python示例代码classTeacher(Person):def__init__(self,name,age,subject):super().__init__(name,age)self.subject=subjectdefintroduce(self):print(f"Mynameis{},Iam{self.age}yearsold,Iteach{self.subject}")项目实践:基于面向对象的学生成绩管理系统实践核心目标设计一个完整的学生成绩管理系统框架掌握面向对象编程思想在实际项目中的应用实现模块化设计,提升代码的可维护性关键功能模块学生信息管理:包括新增、查询、修改与删除成绩统计分析:计算平均分、总分及排名数据持久化:实现简单的数据存储与读取学生成绩管理系统实现步骤(1)核心类定义:StudentClass类属性(Attributes)name:学生姓名(字符串类型)student_id:学生学号(唯一标识)scores:成绩列表(数组/列表类型)类方法(Methods)add_score(score):添加单科成绩到列表get_average_score():计算并返回平均分代码实现逻辑#定义学生类classStudent:def__init__(self,name,student_id):=nameself.student_id=student_idself.scores=[]defadd_score(self,score):self.scores.append(score)defget_average_score(self):returnsum(self.scores)/len(self.scores)学生成绩管理系统实现步骤(2)核心类定义:成绩管理类(GradeManager)核心属性(Attribute)students:用于存储所有学生对象的集合(如列表或字典),作为系统的数据核心。add_student()实现向系统中添加新学生信息的功能,确保数据完整性。remove_student()根据学生ID或姓名从系统中移除指定学生记录。get_student()通过关键字检索并返回学生的详细成绩信息。学生成绩管理系统实现步骤(3)添加学生信息录入学生基本信息,包括学号、姓名、班级等关键数据,建立学生档

温馨提示

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

评论

0/150

提交评论