版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python程序设计基础及应用《Python程序设计基础及应用》配套课件第7章类和对象CONTENTS7.1类和对象的创建7.2封装7.3构造方法和析构方法7.4继承7.5多态7.6案例实战目录
Python程序设计基础及应用本章学习目标01.理解概念深入理解类的概念与特性,掌握对象的创建过程,学会实现类的继承。02.掌握封装理解类的封装特点,学会定义和使用类属性、实例属性、类方法、实例方法。03.熟练应用学会编写类的构造方法(`__init__`)和析构方法(`__del__`),理解类的多态性,并学会方法重写。Python程序设计基础及应用7.1类和对象的创建Python程序设计基础及应用1.定义类▍面向对象的编程方法把待解决的问题按照一定规则划分为多个独立的对象,通过调用对象的方法来实
现多个对象相互配合,完成程序的功能。当应用程序功能发生改变时,只需要修改个别的对象就可以,
从而使得代码容易得到维护。▍面向对象编程符合人们认识事物的规律,数据和操作封装为一体,安全性高,扩展性强。Python程序设计基础及应用1.定义类▍概念类(Class):对象的蓝图或模板,定义了对象的属性和方法,是一个抽象概念。同一种类型的对象进行分类、抽象后,得出共同的特征形成了类。对象(Object):类的具体实例,拥有类定义的属性和方法,是一个具体概念。客观世界里的任何实体都可以被看作是对象。面向对象程序设计的关键就是如何合理地定义类并且组织多个类之间的关系。▍组成创建类时用变量形式表示对象特征的成员称为数据成员(属性),用函数形式表示的对象行为的成员称为成员方法(方法),数据成员和成员方法统称为类的成员。属性:描述类的特征(数据成员),例如:姓名、年龄。方法:描述类的行为(方法成员),例如:运动、说话。Python程序设计基础及应用1.定义类▍类的定义class
<类名>[([父类])]:
<属性> <方法>类名:通常采用大驼峰命名法,首字母大写,例如`Student`。Python中,所有的类都是按新式类来处理,如果没有为一个新创建的类指明父类,则这个类默认从object类直接继承而来。也就是说,class类名(object)”、“class类名()”和“class类名”三种写法没有区别,都按照新式类来处理。Python程序设计基础及应用1.定义类▍对象实例化创建对象的过程称为实例化。创建一个对象时,Python解释器会自动为其在内存中分配空间,并隐式调用构造方法__init__()来初始化对象的属性。▍创建与访问语法创建:对象名=类名([参数...])访问:对象名.属性名|对象名.方法名(参数列表)Python程序设计基础及应用1.定义类classStudent:
def__init__(self,name,age,student_id):
=name #创建数据成员name
self.age=age #创建数据成员age
self.student_id=student_id #创建数据成员student_id
defintroduce(self): #定义方法成员
returnf"Hello,mynameis{},andIam{self.age}yearsold."#创建类的对象并访问其成员alice=Student("Alice",20,"S1001")alice.age=19 #修改对象的属性值print(roduce()) #调用对象的方法,无需传self#输出:Hello,mynameisAlice,andIam19yearsold.Python程序设计基础及应用7.2封装Python面向对象编程1.属性▍封装(Encapsulation)将对象的属性和方法视为一个整体,并隐藏内部实现细节,只暴露必要的接口。目的是实现信息隐藏,保护数据安全。
▍属性分类类属性:在类中所有方法之外定义,被所有实例共享。实例属性:在构造方法`__init__`中定义,以`self`为前缀,属于每个实例对象。
▍
访问控制机制公有属性:默认类型,类的内部和外部均可自由访问。私有属性:名称前加双下划线__,类外部不能直接访问,用于保护敏感数据。Python面向对象编程1.属性▍类属性定义类属性是该类所有对象共享的,不属于任何一个对象。类属性一般不在任何一个成员方法的定义中。▍类属性访问类数据成员属于类,在类外部可以通过类名访问。也可以通过对象名访问,但不建议通过对象名访问,这样做会造成类属性值不一致。▍实例属性定义属于对象的数据成员不需要在类中显示定义,一般在构造方法__init__()中定义,定义时以self(当前对象)作为前缀。当然也可以在其他成员方法中定义,但并不提倡这么做,所有的属性最好在__ini__()构造方法中给出。▍实例属访问实例方法中访问实例属性时以self作为前缀,在类的外部,只能通过对象名访问;Python面向对象编程1.属性如果需要在类外修改类属性,则必须先通过类对象去引用,然后进行修改。如果通过实例对象去引用类属性,则会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。Python面向对象编程1.属性classStudent: school="华山学院" #类属性 def__init__(self,name,age): #构造方法 =name #公有实例属性 self.__age=age #私有示例属性 defintroduce(self): #公有方法 returnf"Hello,mynameis{},andIam{self.__age}yearsold,Iamin{self.school}"alice=Student("Alice",20) #创建Student类的一个实例print(alice.__age) #错误,不能在类外通过实例对象访问私有的类属性print(Student.school) #访问类属性,也可以alice.schoolprint() #访问实例属性Python程序设计基础及应用2.方法Python类的成员方法按照定义规则大致可以分为实例方法,类方法,静态方法。▍实例方法实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参(如果有多个形参的话),self参数代表当前对象。在实例方法中访问实例成员时需要以self为前缀。可以通过对象名和类名调用实例方法。在外部通过对象名调用实例方法时并不需要传递self这个参数。如果在外部通过类名调用属于对象的实例方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的成员。Python程序设计基础及应用2.方法实例方法classRoot:__total=0 #类属性def__init__(self,v): #构造方法(特殊的实例方法,负责对属性初始化)self.__value=vRoot.__total+=1 #访问类属性 defshow(self): #普通实例方法print('self.__value:',self.__value)print('Root.__total:',Root.__total)Python程序设计基础及应用2.方法▍类方法类方法定义需要添加前缀“@classmethod”语句引导,第一个形参通常被命名为cls。类方法既可以通过类名,也可以通过对象名来调用。一个类的所有实例对象共享类方法。类方法是将类本身作为对象进行操作的方法。可以通过它来传递类的属性和方法。Python程序设计基础及应用2.方法classPerson(object):__number=0def__init__(self):Person.__number+=1@classmethoddefgetNumber(cls):returncls.__numberp=Person("张三") #实例化对象p.getNumber() #通过对象名访问类方法Person.getNumber() #通过类名访问类方法Python程序设计基础及应用2.方法▍静态方法静态方法的定义之前需要添加“@staticmethod”。静态方法定义时,不需要表示访问对象的self参数,形式上与普通函数的定义类似。静态方法只能访问属于类的成员,不能访问属于对象的成员。一个类的所有实例对象共享静态方法。使用静态方法时,既可以通过“对象名.静态方法名”来访问,也可以通过“类名.静态方法名”来访问。静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系。静态方法是独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。类方法用于对类成员的修改和传递。Python程序设计基础及应用2.方法▍静态方法#主程序p1=Person("Tom")p1.getName()p1.getNumber()Person.getNumber()p2=Person('Alice')p2.getName()p2.getNumber()Person.getNumber()p1.getNumber()MynameisTom总人数为:1总人数为:1MynameisAlice总人数为:2总人数为:2总人数为:2classPerson:number=0def__init__(self,name):=namePerson.number+=1defgetName(self):print('Mynameis',)
@staticmethod#声明静态defgetNumber():#静态方法没有selfprint("总人数为:",Person.number)Python程序设计基础及应用3.property属性▍作用property是Python中专门用于封装类属性的内置机制。核心作用是:把类的方法伪装成普通属性。既能像访问属性一样简洁操作,又能在背后执行自定义逻辑(校验、计算、修改等)。简单说:对外是属性,对内是方法。▍实现方式既可以使用@property装饰器,也可以使用property类。使用装饰器将方法伪装成属性,是Pythonic且最直观的实现方式。装饰器
作用
调用时机@property 定义读属性 obj.属性@属性名.setter 定义写属性 obj.属性
=
值@属性名.deleter 定义删属性 delobj.属性Python程序设计基础及应用3.property属性▍作用property是Python中专门用于封装类属性的内置机制。核心作用是:把类的方法伪装成普通属性。既能像访问属性一样简洁操作,又能在背后执行自定义逻辑(校验、计算、修改等)。简单说:对外是属性,对内是方法。▍实现方式既可以使用@property装饰器,也可以使用property类。使用装饰器将方法伪装成属性,是Pythonic且最直观的实现方式。装饰器
作用
调用时机@property 定义读属性 obj.属性@属性名.setter 定义写属性 obj.属性
=
值@属性名.deleter 定义删属性 delobj.属性Python程序设计基础及应用3.property属性▍@property必须遵守的规则三个方法名必须完全相同(比如都叫age)必须先写@property,才能写.setter/.deleter通常用下划线开头的变量存真实数据(_age),表示内部私有▍具体语法读取:@property修改:@属性名.setter删除:@属性名.deleterPython程序设计基础及应用3.property属性classPerson:def__init__(self,age):self._age=age #初始化私有属性#获取属性@propertydefage(self):returnself._age#设置属性(必须和上面方法名同名)@age.setterdefage(self,value):ifnotisinstance(value,int):raiseTypeError("年龄必须是整数")ifvalue<0orvalue>150:raiseValueError("年龄必须在0~150之间")self._age=value#删除属性(可选)@age.deleterdefage(self):print("删除年龄属性")delself._agep=Person(20)print(p.age)#读取,自动调用@property方法p.age=30#修改,自动调用@age.setter#p.age=200#报错:年龄非法delp.age#删除,自动调用@age.deleterPython程序设计基础及应用7.3构造方法和析构方法Python程序设计基础及应用1.构造方法▍构造方法__init__构造方法是类实例化过程中,对象分配内存空间后、正式投入使用前,由Python解释器自动触发执行的初始化特殊方法。▍触发时机调用类名类名()进行实例化(Instantiation)时自动执行;▍核心功能完成实例属性初始化、参数接收、成员变量赋值、依赖资源预加载(文件句柄、数据库连接初始化等);▍语法特征第一个形参固定为self,代表当前实例对象引用;可自定义形参列表;无返回值,禁止使用return返回自定义数据。Python程序设计基础及应用1.构造方法▍关键特性属于实例级方法,仅作用于单个对象;类可以重载自定义__init__,若未显式定义,Python提供默认空构造方法;职责仅限初始化资源,不负责对象内存分配(内存分配由__new__方法完成)。classStudent:#构造方法:实例初始化def__init__(self,sid,name):self.sid=sid #实例属性初始化=namePython程序设计基础及应用1.构造方法▍析构方法__del__析构方法是当实例对象引用计数(ReferenceCount)归0、即将被垃圾回收器(GC)销毁时,由Python解释器自动调用的资源释放魔术方法。▍触发时机对象无任何有效引用、被标记为垃圾对象,垃圾回收机制回收对象内存前自动执行;▍核心功能完成资源释放,如关闭文件流、断开网络/数据库连接、释放外部系统资源、清理临时缓存等;▍语法特征仅保留唯一形参self,无额外自定义参数;无返回值。Python程序设计基础及应用1.构造方法▍关键特性Python采用引用计数垃圾回收机制,__del__执行时机不确定,不由程序员手动控制精确调用;程序退出时,所有残留实例会被解释器统一回收,批量触发__del__;不建议主动手动调用__del__,违背生命周期设计范式;若存在循环引用,可能导致__del__无法被及时触发。classFileHandler:def__init__(self,path): #构造方法:占用资源self.f=open(path,"w")
def__del__(self): #析构方法:释放资源self.f.close()print("文件资源已释放")Python程序设计基础及应用1.构造方法▍对比维度
构造方法__init__ 析构方法__del__生命周期阶段
对象创建初始化阶段
对象销毁回收阶段调用逻辑
实例化时必然自动调用
引用计数为0时GC按需调用核心职责
实例属性初始化、资源申请
外部资源释放、善后清理执行可控性
时机固定、完全可控
时机异步、不可精确控制设计范式
主动初始化
被动回调销毁Python程序设计基础及应用7.4继承Python程序设计基础及应用1.单继承▍继承(Inheritance)允许一个类(子类/派生类)继承另一个类(父类/基类)的非私有属性和非私有方法。主要好处是实现代码复用,避免重复编写逻辑,同时也增强了代码的模块化。▍单继承指一个子类只继承自一个父类。这是继承中最简单、最常用的形式。Python语法格式:class子类名(父类名):▍重要注意事项父类中定义的私有属性(以双下划线“__”开头)和私有方法,子类是无法直接继承和访问的。Python程序设计基础及应用1.单继承#定义单一继承classAnimal(object): #父类def__init__(self,color):self.color=colordefrun(self):print("Animalisrunning...")classDog(Animal): #子类继承自Animal passdog=Dog("黑色")print("狗的颜色",dog.color)dog.run()Python程序设计基础及应用2.多继承▍多重继承指一个子类同时继承多个父类的属性和方法,它允许子类融合不同类的特性,在某些场景下能极大地提高代码复用性。▍方法解析顺序(MRO)当多个父类中存在同名方法时,Python解释器会按照特定的“方法解析顺序”查找并执行匹配的方法,避免调用冲突。先子类后父类,多继承从左往右,每个类只查一次,全局唯一顺序▍super()函数的作用用于在子类中显式调用父类的方法,常用于子类构造方法中初始化父类属性。它会自动遵循MRO顺序来调用对应的父类方法,是实现继承协作的关键工具。Python程序设计基础及应用1.单继承classA:deftest(self):print("A")classB(A):deftest(self):print("B")classC(A):deftest(self):print("C")classD(B,C): #多继承:先B,后Cpassd=D()d.test() #D→B→C→A→objectPython程序设计基础及应用3.小结优先单继承,能不用多重继承就不用(多重继承会产生菱形(钻石)继承歧义);严格控制继承层级,不搞深层嵌套多继承(代码可读性、可维护性急剧下降);父类尽量避免同名方法,减少覆盖冲突(方法名命名冲突风险高)多重继承复用强、扩展灵活;但易冲突、难读懂、调试复杂,工程中应谨慎慎用。Python程序设计基础及应用7.5多态Python程序设计基础及应用1.多态概述▍多态含义多态是面向对象三大核心特性(封装、继承、多态)之一,指同一接口、不同实现;父类定义统一规范接口,多个子类重写该接口方法;程序在运行时依据对象实际类型自动绑定对应子类实现,同一消息发送给不同对象,产生不同行为表现。要义:静态接口,动态绑定;一个接口,多种形态。Python不支持重载(同类中同名不同参),只支持重写。▍多态必要条件存在继承关系(子类派生自父类)子类重写(Override)父类同名方法通过父类引用指向子类实例运行时动态类型绑定Python程序设计基础及应用1.多态概述#多态统一接口classTest:@staticmethoddefanimal_sound(ani):
#同一行代码,不同对象执行不同实现ani.speak()#运行时自动绑定真实类型Test.animal_sound(Dog())Test.animal_sound(Cat())#父类/抽象规范classAnimal:defspeak(self):pass#子类重写classDog(Animal):defspeak(self):print("狗:汪汪汪")classCat(Animal):defspeak(self):print("猫:喵喵喵")Python程序设计基础及应用7.6案例实战Python程序设计基础及应用案例一:学生管理系统▍需求说明开发一个学生管理系统,包含学生信息的添加、删除和显示功能,以此实践面向对象编程的封装特性与类的职责划分。▍设计思路1.创建Student类:将学生的姓名、年龄、学号、班级设为私有属性进行封装,并对外提供获取完整信息的公有方法,以及用于识别学生的学号属性访问接口。2.创建StudentManager类:作为管理者类,内部维护一个学生对象列表,提供添加学生、根据学号删除学生、以及展示所有学生信息的管理方法。Python程序设计基础及应用案例一:学生管理系统#代码清单:实现学生信息管理系统的核心结构classStudent:def__init__(self,name,age,sid,grade):self.__name=name;self.__age=age;self.__sid=sid;self.__grade=gradedefget_info(self):returnf"姓名:{self.__name},学号:{self.__sid},年龄:{self.__age},班级:{self.__grade}"@propertydefsid(self):returnself.__sidclassStudentManager:def__init__(self):self.students=[]defadd_student(self,student):self.students.append(student)defremove_student(self,sid):
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阳台加长加宽施工方案(3篇)
- 食堂银行活动方案策划(3篇)
- 26年基础护理服务素养工程课件
- 技能培训安全管理策略
- 光缆护套工保密强化考核试卷含答案
- 新教材人教版九年级物理习题课件第十五章 电流和电路
- 铸管备品工班组考核知识考核试卷含答案
- 汽车热处理生产线操作工风险评估与管理考核试卷含答案
- 浮法玻璃成型工操作水平能力考核试卷含答案
- 水生动物苗种繁育工安全防护强化考核试卷含答案
- 工业地转让协议书
- 2026年河北机关事业单位工人技能等级考试(公共基础知识)仿真试题及答案
- 2026年部编版语文六年级下册期末测试题(共5套有答案)
- 2026年国有企业领导人员廉洁从业若干规定知识试题
- 2026届江苏省兴化市戴泽初中重点名校十校联考最后历史试题含解析
- 反复尿路感染指南总结2026
- 2026山东济南城市投资集团有限公司社会招聘47人农业笔试备考试题及答案解析
- 2026成都市属事业单位考试真题答案
- 室内质量控制与室间质量评价管理制度与操作规程
- 2025年江苏淮安涟水县卫生健康委员会所属事业单位公开招聘工作人员42名笔试历年典型考题及考点剖析附带答案详解试卷2套
- GB/Z 31813-2015饲料原料和饲料添加剂畜禽靶动物有效性评价试验技术指南
评论
0/150
提交评论