版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章面向对象程序设计主要内容面向对象编程的基本概念01类的定义与对象的创建02属性与方法03封装与访问控制04继承与多态05面向对象编程实例06面向对象编程的基本概念01什么是面向对象编程面向对象编程(Object-OrientedProgramming,OOP)一种以对象为核心的编程范式,它将程序组织为对象的集合,每个对象都是类的实例。核心思想:通过对象模拟现实世界中的实体,将数据(属性)和行为(方法)封装在一起,从而提高代码的可重用性、可维护性和可扩展性。OOP更贴近现实世界的思维方式:在开发一个汽车管理系统时,可以将“汽车”抽象为一个类,每辆具体的汽车则是该类的对象。通过这种方式,程序结构更加清晰,代码更易于理解和维护。面向对象编程优势模块化复用性扩展性易维护性类与对象类是对象的蓝图或模板,定义了对象的属性(数据)和方法(行为)。
例如,“汽车”类可以包含颜色、
品牌等属性,以及启动、停止等
方法。类是抽象的,描述了对象的共同特征和行为。对象是类的实例,是具体的实体。
例如,根据“汽车”类可以创建
一辆白色的比亚迪汽车对象。每个对象都有自己的属性值,但共享类定义的行为。1.类(Class)classCar:def__init__(self,color,brand):
self.color=color
self.brand=brand
defstart(self):print(f"{self.brand}汽车启动了")2.对象(Object)my_car=Car(白色","比亚迪")my_car.start()
#输出:比亚迪汽车启动了3.类与对象的关系类是抽象的,对象是具体的。类定义了对象的属性和方法,对象是类的具体表现。一个类可以创建多个对象,每个对象都是独立的。面向对象的特点:封装、继承、多态1.封装(Encapsulation)将数据(属性)和行为(方法)组织在对象内部,通过定义明确的接口与外部交互。通过封装,可以保护数据不被外部直接修改,同时隐藏实现细节。封装的作用主要体现在以下方面:信息隐藏:屏蔽内部实现细节,使对象内部变化不影响外部调用方;访问控制:强制通过方法操作数据,避免直接修改导致的不可预测错误;解耦设计:降低模块间依赖,提升系统可维护性。面向对象的特点:封装、继承、多态2.继承(Inheritance)继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。继承的作用主要体现在以下方面:代码复用:子类直接继承父类功能,避免重复编写相同逻辑;扩展性:子类可添加新属性和方法,或重写父类方法实现定制行为;层次化建构:通过类继承树模拟现实世界的分类关系(如“动物→哺乳动物→猫”)。面向对象的特点:封装、继承、多态3.多态(Polymorphism)多态允许不同类的对象对同一消息做出不同的响应。它提高了代码的灵活性和可扩展性。多态的作用主要体现在以下方面:接口统一:不同类型对象可通过相同接口操作,降低调用方复杂度;行为定制:子类重写父类方法,实现针对性的功能逻辑;系统扩展:新增子类不影响现有代码,符合开闭原则(即对扩展开放,对修改关闭)。类的定义与对象的创建02定义类在Python中,使用class关键字定义类。类名通常采用驼峰命名法(即每个单词首字母大写,不以下划线分隔)。类是对象的蓝图,定义了对象的属性(数据)和方法(行为)。类的结构包括类中可以包含属性(变量)和方法(函数)。方法的第一个参数通常是self,表示对象本身。classCar:wheels=4
#类属性(所有对象共享)def__init__(self,color,brand):
self.color=color
#实例属性
self.brand=brand
#实例属性
defstart(self):
#实例方法
print(f"{self.brand}汽车启动了")创建对象通过类名加括号的方式创建对象。创建对象时,会自动调用初始化方法__init__方法来初始化对象。my_car=Car("白色","比亚迪")
#创建对象my_carprint(my_car.color)#输出:白色print(my_car.brand)#输出:比亚迪my_car.start()#输出:比亚迪汽车启动了对象特性每个对象都是独立的,拥有自己的属性值。对象可以调用类中定义的方法。可以通过isinstance()函数检查对象是否属于某个类。print(isinstance(my_car,Car))#输出:True对象初始化流程1.__init__的作用在创建对象时自动调用,用于初始化对象的属性。可以接受参数,用于设置对象的初始状态。如果没有显式定义__init__方法,Python会继承基类(通常是object类)的无参初始化方法。classCar:def__init__(self,color,brand):self.color=color
#初始化颜色属性self.brand=brand#初始化品牌属性print(f"一辆{self.color}的{self.brand}汽车被创建了")my_car=Car("白色","比亚迪")
#输出:一辆白色的比亚迪汽车被创建了对象初始化流程2.初始属性赋值通过__init__方法为对象设置初始状态。该方法内部定义的均为实例属性。classCar:
wheels=4
#类属性(所有对象共享)def__init__(self,color,brand):
self.color=color
#实例属性
self.brand=brand
#实例属性
对象初始化流程3.self的含义self是实例方法的第一个参数,代表当前对象实例的引用。classPhone:def__init__(self,model):
self.model=model
defpower_on(self):print(f"{self.model}已开机")p1=Phone("Mate60")p1.power_on()#输出:Mate60已开机
属性与方法03类属性与实例属性2.实例属性实例属性属于特定对象,每个对象的实例属性可以不同。实例属性通常在__init__方法中定义,并通过self访问。classCar:def__init__(self,color):
self.color=color
#实例属性
my_car=Car("红色")print(my_car.color)
#输出:红色1.类属性类属性属于类本身,所有对象共享同一个类属性。类属性通常在类中直接定义,而不是在方法中。类属性可以通过类名或对象访问,但修改类属性时应通过类名进行。classCar:wheels=4
#类属性
my_car=Car()print(my_car.wheels)
#输出:4print(Car.wheels)
#输出:4
Car.wheels=6
#修改类属性print(my_car.wheels)
#输出:6方法类型用于操作实例属性,第一个参数为self,表示对象本身。只能通过对象调用用于操作类属性,使用@classmethod装饰器定义,第一个参数为cls,表示类本身。可以通过类名或对象调用。1.类方法2.实例方法3.静态方法与类和实例无关,使用@staticmethod装饰器定义,不需要self或cls参数。通常用于实现与类相关但不依赖类或实例状态的工具函数。classCar:def__init__(self,color):
self.color=color
#实例属性
defdrive(self):#实例方法print(f"{self.color}汽车正在行驶")
my_car=Car("红色")my_car.drive()
#输出:红色汽车正在行驶classCar:wheels=4#类属性def__init__(self,color):self.color=color
#实例属性
@classmethoddefdrive(cls):#类方法print(f"{cls.wheels}个轮子的汽车正在行驶")#通过cls访问类属性my_car=Car("红色")Car.drive()#通过类名调用类方法my_car.drive()#通过对象调用类方法classCar:@staticmethoddefhonk():
#静态方法
print("滴滴!")
Car.honk()
#输出:滴滴!属性装饰器@property@property装饰器用于将方法转换为属性,从而实现对属性的访问和修改控制。通过@property,可以将属性的读取、写入和删除操作封装为方法。@property装饰器提供对属性的精细控制,可以在读取或写入时添加逻辑(如数据验证);保持接口的一致性,外部代码无需知道属性是直接存储还是通过方法计算。@property装饰器的基本用法使用@property定义属性的读取方法。使用@属性名.setter定义属性的写入方法。使用@属性名.deleter定义属性的删除方法。classCar:def__init__(self,speed):self._speed=speed#保护属性(单下划线约定)
@propertydefspeed(self):
"""获取当前速度(km/h)"""returnself._speed
@speed.setterdefspeed(self,value):
"""设置速度并验证合法性"""ifvalue<0:raiseValueError("速度不能为负值")self._speed=value
@speed.deleterdefspeed(self):
"""删除速度属性并释放资源"""print("速度属性已被删除")delself._speedmy_car=Car(60)print(f"初始速度:{my_car.speed}km/h")#输出:60my_car.speed=80print(f"修改后速度:{my_car.speed}km/h")
#输出:80try:my_car.speed=-10#触发ValueErrorexceptValueErrorase:print(f"错误:{e}")
#输出:速度不能为负值delmy_car.speed#输出:速度属性已被删除#删除后访问验证try:print(my_car.speed)
#访问已删除属性exceptAttributeErrorase:print(f"访问错误:{e}")
#输出:'Car'objecthasnoattribute'_speed'@property适用于需要控制访问或计算的属性。应避免在@property方法中执行耗时操作,因为属性访问通常被认为是轻量级的。注意:特殊方法(“魔术方法”)方法名专业称谓所属协议功能范畴__str__字符串表示方法
(StringRepresentationMethod)字符串转换协议创建用户友好的字符串表示__del__析构方法
(DestructorMethod)生命周期协议对象销毁时的清理操作__eq__等于运算符方法(EqualityOperatorMethod)比较协议定义对象之间的相等性比较__len__长度协议方法
(LengthProtocolMethod)容器协议返回对象长度/大小__getitem__下标访问方法
(SubscriptAccessMethod)序列/映射协议实现索引访问功能封装与访问控制04封装的概念核心思想将数据(属性)和行为(方法)组织在对象内部,通过定义明确的接口与外部交互。封装实现目标数据保护:通过访问控制机制防止外部代码直接修改对象的内部状态,确保数据的有效性和一致性。接口抽象:仅暴露必要的操作接口,隐藏内部实现细节,降低模块间的耦合度。使用简化:外部代码只需理解接口契约,无需了解内部复杂的实现逻辑。封装的概念通过以下两种命名约定实现封装:单下划线约定单下划线_前缀命名是Python社区约定的保护成员标识,明确其为“不应直接访问”的成员,但这并不是Python语言层面的强制保护,而是一个约定俗成的习惯。它的主要目的是为了提升代码的可读性和团队协作效率,因为开发者看到单下划线前缀就会知道这个成员是内部使用的,不应该在类外部直接访问。双下划线约定双下划线__前缀命名是Python语言层面的名称修饰机制,通过语法级改造实现成员访问限制。在类外部无法直接通过原名(__var)访问(会被重命名为_ClassName__var),但通过修饰后的名称仍可访问。它的主要目的是避免子类意外覆盖父类私有成员(__var),避免大型项目命名冲突。同样,这也是约定而非强制,但比单下划线有更强的约束性。访问控制1.公开接口(PublicInterface)命名无前缀的属性或方法,允许外部直接访问。classCar:def__init__(self,name):
=name
#为公有属性
my_car=Car("比亚迪")print(my_)
#输出:比亚迪访问控制2.内部实现细节(InternalImplementation)命名采用单下划线开头的属性或方法,是PEP8约定的内部使用标识,仅提示开发者避免直接访问,但子类和外部代码仍可强制访问,但明确表示“可能在不通知调用方的情况下变更”。classCar:def__init__(self,model):
self._model=model
#内部使用属性my_car=Car("SUV")print(my_car._model)
#输出:SUV(不推荐直接访问,但语法允许)访问控制3.名称修饰机制(NameMangling)命名采用双下划线开头的属性或方法,在类定义阶段由解释器执行对其进行重命名为_ClassName__var,主要用于避免子类意外覆盖父类属性,特别是混合继承场景下的同名属性。通过_ClassName__var形式仍可显式访问。classCar:def__init__(self,engine):
self.__engine=enginemy_car=Car("V8")print(my_car.__engine)
#报错:AttributeErrorprint(my_car._Car__engine)
#输出:V8继承与多态05继承的应用1.继承的概念继承是面向对象编程的重要特性,允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以复用父类的代码,并可以扩展或重写父类的功能。
继承体现了“is-a”关系:“汽车是一种交通工具”。在Python中,通过在类定义时指定父类来实现继承。
子类可以访问父类的属性和方法,也可以定义自己的属性和方法。继承的应用2.单一继承
指一个子类只继承一个父类。在Python中,通过在类定义时指定父类来实现单一继承。classVehicle:#父类def__init__(self,brand):self.brand=brand
defdrive(self):print("正在行驶")classCar(Vehicle):#子类def__init__(self,brand,color):super().__init__(brand)#按MRO调用父类初始化方法self.color=color
defdrive(self):#重写父类方法:方法名和参数必须相同print(f"{self.color}的{self.brand}汽车正在行驶")my_car=Car("比亚迪","白色")my_car.drive()#输出:白色的比亚迪汽车正在行驶继承的应用3.多重继承
一个子类可以继承多个父类。classEngine:defstart(self):print("引擎启动")classElectricVehicle:defcharge(self):print("正在充电")classHybridCar(Car,Engine,ElectricVehicle):#继承多个父类passmy_hybrid_car=HybridCar("比亚迪","白色")my_hybrid_car.start()#按MRO调用Engine.startmy_hybrid_car.charge()#按MRO调用ElectricVehicle.charge多态的实现多态(Polymorphism)面向对象编程的重要特性,允许不同类的对象对同一方法做出不同的响应。多态优势代码复用:通过统一的接口处理不同类型的对象,减少重复代码。扩展性:新增类时无需修改现有代码,只需确保新类实现了所需的方法。灵活性:程序可以在运行时动态决定调用哪个类的方法。多态主要用于处理不同类型的对象集合;实现插件式架构,允许动态加载和调用不同的类。多态的实现在Python中,多态主要通过鸭子类型(DuckTyping)
实现,而抽象基类(AbstractBaseClasses,ABCs)
提供了一种形式化的接口验证机制。1.鸭子类型鸭子类型是Python实现多态的核心机制,其理念是“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子”。在Python中,只要对象实现了所需的方法,就可以被视为同一类型,而无需显式继承或实现接口。clas
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七年级道德与法治质量分析报告
- 2026年保险集成托管运营协议
- 2026年航天维护元宇宙内容制作合同
- 2026年半导体审计节能改造合同
- 村干部在扶贫工作制度
- 预约病案复印工作制度
- 领导专职秘书工作制度
- 领导顶板替岗工作制度
- 食品安全委员工作制度
- 麻醉科十六项工作制度
- 气象灾害防御工作制度
- PEP人教版六年级下册英语教案全册
- 2026校招:上海银行笔试题及答案
- 2026年郑州信息科技职业学院单招职业适应性测试题库与答案详解
- 2025年高中创新能力大赛笔试题资格审查试题(附答案)
- 电力电子技术-新能源变换技术教学课件:4.2.3 单相半桥逆变电路
- 《高速公路机电系统集成与维护》课件-07.ETC门架系统
- 进料检验作业控制程序(最全面-不下你会后悔的)
- 《文字录入》课程标准
- 婴幼儿学习环境的评价量表
- 阀门基础知识培训课件
评论
0/150
提交评论