Python面向对象:封装、继承、多态
作为Python面向对象编程OOP的三大核心特性封装、继承、多态是从编程新手进阶到熟练开发者的必备知识。它们不是晦涩的理论而是能让代码更简洁、复用性更强、扩展性更好的实用工具。一、什么是面向对象在讲三大特性前先明确两个基础概念类Class是模板比如「人类」定义了属性和行为的规则对象Object是实例比如「张三」「李四」是类的具体实现。也就是说类是抽象而对象是一个看得见摸得着的实体面向对象的核心思想把数据和操作数据的方法绑定在一起用对象管理代码而不是零散的函数和变量。而封装、继承、多态就是实现这一思想的三大支柱。二、特性一封装 —— 保护数据只留必要接口1. 什么是封装把类的核心数据和方法藏起来只对外暴露安全的调用接口。就像我们用手机只需要按屏幕、点按钮不需要知道内部芯片、电路的工作原理——内部细节被「封装」了既保护了数据安全又简化了使用。2. Python封装的实现Python没有严格的private关键字用下划线约定实现封装单下划线_属性/方法保护成员约定不建议外部直接访问双下划线__属性/方法私有成员外部无法直接访问强制封装。3. 代码示例classPerson:def__init__(self,name,age):self.namename# 公有属性外部可直接访问self.__ageage# 私有属性外部无法直接访问封装核心# 对外暴露的方法安全获取私有属性defget_age(self):returnself.__age# 对外暴露的方法安全修改私有属性可加校验defset_age(self,new_age):if0new_age150:# 封装校验逻辑防止非法数据self.__agenew_ageelse:print(年龄不合法)# 创建对象pPerson(张三,20)# 1. 公有属性可直接访问print(p.name)# 输出张三# 2. 私有属性无法直接访问会报错# print(p.__age) # 报错AttributeError# 3. 通过暴露的方法访问/修改私有属性print(p.get_age())# 输出20p.set_age(25)# 合法修改print(p.get_age())# 输出25p.set_age(200)# 输出年龄不合法封装的优点保护数据安全防止外部随意修改核心数据简化使用外部只需调用接口无需关心内部逻辑便于维护内部逻辑修改不影响外部调用。三、继承1.单继承.py# 单继承子类只继承一个父类classFather:def__init__(self):self.money1000defdrive(self):print(爸爸会开车)# Son 类 继承 Father类classSon(Father):# 子类可以拥有自己的属性和方法defstudy(self):print(儿子会学习)# 创建子类对象sSon()# 子类对象直接使用父类的属性和方法print(s.money)s.drive()s.study()2.重写.py# 方法重写子类定义和父类同名的方法覆盖父类实现classFather:defdrive(self):print(爸爸开燃油车)# 子类重写父类方法classSon(Father):defdrive(self):print(儿子开电动车)sSon()# 调用的是子类重写后的方法s.drive()3.super()调用父类的同名方法# super()在子类中调用父类的同名方法classFather:defdrive(self):print(爸爸开燃油车)classSon(Father):defdrive(self):# 调用父类的drive方法super().drive()print(儿子开电动车)sSon()s.drive()4.多继承.py# 多继承一个子类继承多个父类classFather:defdrive(self):print(爸爸会开车)classMother:defcook(self):print(妈妈会做饭)# 子类同时继承两个父类classSon(Father,Mother):passsSon()s.drive()s.cook()5.练习方法查找顺序# 方法查找顺序 MRO从当前类 - 左父类 - 右父类 - objectclassA:deffunc(self):print(A类方法)classB(A):deffunc(self):print(B类方法)classC(B):pass# 查看类的继承顺序print(C.__mro__)cC()c.func()6演示python的伪多态# Python 伪多态鸭子类型不强制继承只要有同名方法就可以调用classDog:defspeak(self):print(汪汪汪)classCat:defspeak(self):print(喵喵喵)# 统一调用接口不需要继承同一个父类defmake_speak(animal):animal.speak()make_speak(Dog())make_speak(Cat())7.isinstance# isinstance判断对象是否是某个类或子类的实例classFather:passclassSon(Father):passsSon()fFather()print(isinstance(s,Son))# Trueprint(isinstance(s,Father))# True子类对象属于父类类型print(isinstance(f,Son))# False8.成员属性和类属性# 成员属性实例属性每个对象独立拥有# 类属性所有对象共享属于类classPerson:# 类属性species人类def__init__(self,name):# 成员实例属性self.namename# 访问类属性print(Person.species)p1Person(张三)p2Person(李四)# 实例访问类属性print(p1.species)print(p2.name)四、多态 —— 同一行为不同表现1. 什么是多态一句话总结不同子类对象调用同一个父类方法表现出不同的行为。前提继承 方法重写。就像「动物」都会叫但「狗」是汪汪叫「猫」是喵喵叫——同一个「叫」的行为不同子类有不同实现。2. 代码示例# 父类动物classAnimal:defspeak(self):pass# 父类定义方法模板不具体实现# 子类1狗classDog(Animal):# 重写speak方法defspeak(self):print(汪汪汪)# 子类2猫classCat(Animal):# 重写speak方法defspeak(self):print(喵喵喵)# 统一调用函数接收任意Animal子类对象defanimal_speak(animal):animal.speak()# 创建不同子类对象dogDog()catCat()# 同一方法不同表现多态核心animal_speak(dog)# 输出汪汪汪animal_speak(cat)# 输出喵喵喵多态的优点灵活通用统一调用接口无需区分具体子类易于扩展新增子类时无需修改原有调用代码降低耦合代码依赖父类不依赖具体子类。五、三大特性核心总结特性核心思想作用封装藏细节露接口保护数据简化使用继承子类复用父类减少重复代码层级清晰多态同一行为不同表现代码灵活易于扩展用封装保护数据用继承复用代码用多态实现灵活扩展——这就是Python面向对象的核心逻辑。六、实战三合一综合示例# 父类员工封装继承基础classEmployee:def__init__(self,name,salary):self.namename self.__salarysalary# 封装私有属性defget_salary(self):returnself.__salarydefwork(self):pass# 多态模板方法# 子类1程序员继承重写classProgrammer(Employee):defwork(self):print(f{self.name}正在写代码月薪{self.get_salary()}元)# 子类2产品经理继承重写classPM(Employee):defwork(self):print(f{self.name}正在写需求月薪{self.get_salary()}元)# 多态调用defwork(emp):emp.work()# 创建对象pProgrammer(张三,20000)pmPM(李四,18000)# 统一调用不同表现work(p)# 输出张三正在写代码月薪20000元work(pm)# 输出李四正在写需求月薪18000元结语封装隐藏内部细节仅暴露安全接口保护数据安全继承子类复用父类属性和方法支持方法重写减少代码冗余多态基于继承和方法重写同一接口实现不同行为提升代码灵活性封装、继承、多态不是纸上谈兵的理论而是写高质量Python代码的必备工具做项目时用封装保护核心数据有重复代码时用继承快速复用需要灵活扩展时用多态简化逻辑。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2480969.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!