ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【Python 入门】面向对象进阶:封装、继承、多态、魔术方法与类型注解全解析

【Python 入门】面向对象进阶:封装、继承、多态、魔术方法与类型注解全解析 文章目录前言一、封装隐藏内部细节只暴露必要接口1.1 封装的概念1.2 私有成员的定义1.3 完整示例二、继承复用代码扩展功能2.1 继承的概念2.2 单继承语法2.3 多继承语法2.4 方法复写与父类调用三、多态同一行为不同对象产生不同结果3.1 多态的概念3.2 基础示例3.3 抽象类接口四、常用魔术方法4.1 __init__构造方法4.2 __str__字符串表示4.3 比较运算魔术方法五、类型注解5.1 什么是类型注解5.2 变量类型注解5.3 函数类型注解5.4 Union 联合类型六、总结前言在上一篇中我们学习了类与对象的基础用法本篇将深入面向对象的核心三大特性 —— 封装、继承、多态同时补充 Python 特有的魔术方法、类型注解两大实用知识点帮你全面掌握面向对象进阶语法写出更规范、更易维护的代码。一、封装隐藏内部细节只暴露必要接口1.1 封装的概念封装有两层含义将事物的属性和行为封装到类中用类来描述现实事物访问权限控制类内部的属性和方法可以设置为私有不对外暴露只允许内部使用1.2 私有成员的定义Python 中通过双下划线开头来定义私有成员私有成员变量__变量名私有成员方法__方法名规则私有成员无法通过对象.成员直接访问类内部的其他成员方法可以正常访问私有成员1.3 完整示例classPhone:# 私有成员变量当前电压__current_voltage0.8# 私有成员方法单核运行模式def__keep_single_core(self):print(CPU切换为单核运行模式)# 公开成员方法5G通话defcall_by_5G(self):ifself.__current_voltage1:print(5G通话已开启)else:self.__keep_single_core()print(电量不足无法开启5G已切换为省电模式)phonePhone()phone.call_by_5G()# 以下代码会报错私有成员无法直接访问# print(phone.__current_voltage)# phone.__keep_single_core()补充说明Python 的私有是 “名字修饰”name mangling机制并非绝对禁止访问只是约定层面的私有不建议强行访问。二、继承复用代码扩展功能2.1 继承的概念继承就是子类拥有父类的所有成员变量和成员方法私有成员除外可以减少重复代码实现功能扩展。单继承继承一个父类多继承继承多个父类2.2 单继承语法class子类名(父类名):子类内容示例# 父类基础手机classPhone:producer原厂defcall_by_5g(self):print(正在使用5G通话)# 子类2026款手机继承父类classPhone2026(Phone):item_id100001defcall_by_6g(self):print(正在使用6G通话)phonePhone2026()print(phone.producer)# 继承自父类phone.call_by_5g()# 继承自父类phone.call_by_6g()# 子类自有方法2.3 多继承语法class子类名(父类1,父类2,父类3...):子类内容示例classNFCReader:nfc_type第18代producer厂商Adefread_card(self):print(NFC读卡)classRemoteControl:producer厂商Bdefcontrol(self):print(红外遥控)# 多继承classMyPhone(NFCReader,RemoteControl):passphoneMyPhone()phone.read_card()phone.control()print(phone.producer)# 输出厂商A关键规则多个父类有同名成员时继承顺序从左到右优先级递减左边的父类成员会覆盖右边的。Python 通过 MRO方法解析顺序机制确定调用顺序。2.4 方法复写与父类调用子类可以重新定义父类中已有的属性和方法叫做复写重写。复写后如果还想调用父类的成员有两种方式classPhone:producer原厂defcall_by_5g(self):print(正在使用5G通话)classMyPhone(Phone):producer新厂商defcall_by_5g(self):print(正在使用5G通话已开启高清音质)# 方式1父类名.成员(self)# print(f父类厂商{Phone.producer})# Phone.call_by_5g(self)# 方式2super()调用推荐print(f父类厂商{super().producer})super().call_by_5g()phoneMyPhone()phone.call_by_5g()注意通过父类名调用方法时必须手动传入self参数super()调用则不需要。三、多态同一行为不同对象产生不同结果3.1 多态的概念多态指同一个方法调用传入不同的对象会执行不同的逻辑产生不同的结果。核心思想以父类做声明以子类做实现。3.2 基础示例# 父类classAnimal:defspeak(self):pass# 子类1classDog(Animal):defspeak(self):print(汪汪汪)# 子类2classCat(Animal):defspeak(self):print(喵喵喵)# 统一的调用函数defmake_noise(animal:Animal):animal.speak()dogDog()catCat()make_noise(dog)make_noise(cat)3.3 抽象类接口父类中方法体为空pass的方法叫做抽象方法包含抽象方法的类叫做抽象类。作用定义方法规范强制子类必须实现该方法补充Python 标准库abc模块可以实现真正的强制抽象子类不实现则实例化报错入门阶段先掌握空实现写法即可fromabcimportABC,abstractmethod# 标准抽象类写法classAC(ABC):abstractmethoddefcool_wind(self):passabstractmethoddefhot_wind(self):passclassGREE(AC):defcool_wind(self):print(格力空调制冷)defhot_wind(self):print(格力空调制热)四、常用魔术方法Python 中以双下划线开头和结尾的内置方法叫做魔术方法它们在特定场景下自动触发常用的有以下几类4.1__init__构造方法创建对象时自动调用用于初始化属性前面已经详细讲解。4.2__str__字符串表示打印对象时自动调用默认打印内存地址重写后可以自定义输出内容。classStudent:def__init__(self,name,age):self.namename self.ageagedef__str__(self):returnfStudent(name{self.name}, age{self.age})stuStudent(张三,22)print(stu)# 输出Student(name张三, age22)4.3 比较运算魔术方法方法触发场景作用__lt__(self, other)x y定义小于号逻辑__le__(self, other)x y定义小于等于号逻辑__eq__(self, other)x y定义等于号逻辑__gt__(self, other)x y定义大于号逻辑__ge__(self, other)x y定义大于等于号逻辑示例classStudent:def__init__(self,name,age):self.namename self.ageagedef__lt__(self,other):returnself.ageother.age stu1Student(张三,22)stu2Student(李四,25)print(stu1stu2)# True五、类型注解5.1 什么是类型注解Python 是动态类型语言变量类型不固定。引入了类型注解用于提示变量的预期类型帮助 IDE 提供代码提示提升代码可读性不会强制校验类型仅作提示5.2 变量类型注解语法变量名: 类型# 基础类型var_1:int10var_2:strhellovar_3:float3.14# 类对象注解classStudent:passstu:StudentStudent()# 容器详细注解# Python 3.9 可以直接用内置类型my_list:list[int][1,2,3]my_dict:dict[str,int]{a:1,b:2}my_tuple:tuple[int,str,bool](1,a,True)注意元组的详细注解需要标注每一个元素的类型字典注解格式为dict[键类型, 值类型]。5.3 函数类型注解可以给形参和返回值添加类型注解defadd(a:int,b:int)-int:returnab5.4 Union 联合类型当变量可能是多种类型时使用Union需要从typing模块导入fromtypingimportUnion# 列表元素可以是int或strmy_list:list[Union[int,str]][1,2,a,b]# 函数参数和返回值支持多种类型deffunc(data:Union[int,str])-Union[int,str]:returndata六、总结封装通过双下划线定义私有成员隐藏内部实现只对外暴露必要接口继承单继承 / 多继承复用父类代码支持方法复写通过super()调用父类成员多态同一方法传入不同对象产生不同行为配合抽象类定义开发规范魔术方法__init__、__str__、比较方法等在特定场景自动触发类型注解提升代码可读性与 IDE 提示支持基础类型、容器、函数、联合类型
返回列表