2026/3/5 7:35:18
网站建设
项目流程
网站关键词突然搜不到了,哪个网站的ppt模板最好,做阅读任务挣钱的网站,html5源码Python 面向对象编程#xff08;OOP#xff09;详解#xff1a;一篇足矣#xff08;2026 年实用版#xff09;
前言#xff1a;Python 的面向对象编程#xff08;OOP#xff09;是其核心特性之一#xff0c;让代码更模块化、可复用、可维护。OOP 三大支柱#xff1a…Python 面向对象编程OOP详解一篇足矣2026 年实用版前言Python 的面向对象编程OOP是其核心特性之一让代码更模块化、可复用、可维护。OOP 三大支柱封装Encapsulation、继承Inheritance、多态Polymorphism。如果你是新手别担心我们从 0 基础开始由浅入深。教程基于 Python 3.12包含代码示例直接复制运行。学完这篇你能自信写出 80% 实际项目中的 OOP 代码。我们分成这些模块学建议按顺序OOP 基础概念类和对象创建属性与方法继承与多态封装与访问控制特殊方法魔法方法类变量 vs 实例变量、静态/类方法高级话题抽象类、接口、多继承常见错误 最佳实践小练习 面试题1. OOP 基础概念为什么用 OOP类Class蓝图/模板比如“汽车”类定义了所有汽车的共同特征颜色、速度和行为开车、刹车。对象Object类的实例比如一辆具体的“红色特斯拉”。为什么用 OOP复用写一次类到处创建对象。组织大项目分模块。抽象隐藏复杂细节只露接口。生活比喻类 手机模具对象 你手里的 iPhone。一句话一切皆对象Python 哲学int、str、list 都是内置类。2. 类和对象创建最简单起步用class关键字定义类。# 定义类类名首字母大写驼峰式classDog:pass# 空类占位# 创建对象实例化my_dogDog()# my_dog 是 Dog 的实例print(type(my_dog))# 输出: class __main__.Dog进阶带初始化方法__init__。classDog:def__init__(self,name,age):# self 是实例自身必须第一个参数self.namename# 实例属性self.ageage# 创建对象my_dogDog(旺财,3)print(my_dog.name)# 输出: 旺财Tips__init__不是构造函数Python 没有严格构造函数而是初始化方法。类定义时不执行实例化时自动调用。3. 属性与方法类的核心内容属性Attribute数据如 name、age。方法Method行为如 bark、run。classDog:def__init__(self,name,age):self.namename self.ageagedefbark(self):# 方法self 必备print(f{self.name}汪汪叫)defrun(self,speed):print(f{self.name}以{speed}km/h 跑)my_dogDog(旺财,3)my_dog.bark()# 输出: 旺财 汪汪叫my_dog.run(20)# 输出: 旺财 以 20 km/h 跑属性分类实例属性每个对象独立如 self.name。类属性所有对象共享见第 7 节。方法调用总是对象.方法()内部用 self 访问属性。4. 继承与多态代码复用神器继承子类继承父类属性/方法可扩展/覆盖。classAnimal:# 父类基类def__init__(self,species):self.speciesspeciesdefeat(self):print(吃东西...)classDog(Animal):# 子类派生类继承 Animaldef__init__(self,name,age):super().__init__(狗)# 调用父类 __init__self.namename self.ageagedefbark(self):print(f{self.name}汪汪)defeat(self):# 方法覆盖重写print(f{self.name}吃骨头)# 多态体现my_dogDog(旺财,3)my_dog.eat()# 输出: 旺财 吃骨头覆盖父类print(my_dog.species)# 输出: 狗继承父类多态不同子类用同名方法行为不同鸭子类型。classCat(Animal):defeat(self):print(吃鱼)animals[Dog(旺财,3),Cat()]# Cat 需加 __init__这里省略foranimalinanimals:animal.eat()# 多态狗吃骨头猫吃鱼super()调用父类方法Python 3 推荐无参数形式。5. 封装与访问控制隐藏细节封装把数据/方法打包隐藏内部实现。Python无严格私有约定俗成用 _ 或 __。访问级别写法说明公有name外部可直接访问保护约定_name子类可访问外部不建议私有伪__name名称改写为 _Class__name外部难访问classBankAccount:def__init__(self,balance):self.__balancebalance# 私有属性defdeposit(self,amount):self.__balanceamountdefget_balance(self):# getter 方法returnself.__balance accountBankAccount(100)print(account.get_balance())# 100# print(account.__balance) # AttributeError但可通过 _BankAccount__balance 访问勿滥用property优雅 getter/setterC 无等价classCircle:def__init__(self,radius):self.__radiusradiuspropertydefradius(self):returnself.__radiusradius.setterdefradius(self,value):ifvalue0:raiseValueError(半径不能负)self.__radiusvalue cCircle(5)print(c.radius)# 5像属性访问c.radius10# setter 调用6. 特殊方法魔法方法Python OOP 的灵魂这些以__开头的双下划线方法让类像内置类型一样行为。常见魔法方法作用示例代码init初始化如上strprint 时调用return fDog: {self.name}reprrepr() 或调试时return fDog(‘{self.name}’, {self.age})lenlen(obj)return 长度getitemobj[key]支持索引如列表callobj() 如函数调用defcall(self): print(“调用”)addobj1 obj2return self.value other.valueclassVector:def__init__(self,x,y):self.xx self.yydef__add__(self,other):returnVector(self.xother.x,self.yother.y)def__str__(self):returnf({self.x},{self.y})v1Vector(1,2)v2Vector(3,4)print(v1v2)# 输出: (4, 6)Tips魔法方法让类“鸭子类型”兼容如自定义类支持 操作符。7. 类变量 vs 实例变量、静态/类方法类变量类级共享所有实例共用。实例变量每个实例独立。classDog:species狗# 类变量def__init__(self,name):self.namename# 实例变量d1Dog(旺财)d2Dog(小黑)print(d1.species,d2.species)# 狗 狗Dog.speciesCanine# 修改类变量所有实例变print(d1.species)# Canine静态方法不访问 self/class用 staticmethod。类方法访问类用 classmethod第一个参数 cls。classMathUtil:staticmethoddefadd(a,b):returnab# 无 self/clsclassmethoddeffrom_string(cls,s):returncls()# cls 是类自身可创建实例print(MathUtil.add(1,2))# 3像函数调用8. 高级话题抽象类、接口、多继承抽象类不能实例化强制子类实现方法。用 abc 模块。fromabcimportABC,abstractmethodclassShape(ABC):abstractmethoddefarea(self):passclassRectangle(Shape):def__init__(self,w,h):self.w,self.hw,hdefarea(self):returnself.w*self.h rRectangle(2,3)print(r.area())# 6# Shape() # TypeError: Cant instantiate abstract class接口Python 无正式接口但用抽象类模拟全抽象方法。多继承支持但小心菱形问题MRO 方法解析顺序。classA:passclassB:passclassC(A,B):pass# 多继承print(C.mro())# [class C, class A, class B, class object]菱形继承用 super() 解决调用顺序。9. 常见错误 最佳实践错误类型描述 修复忘记 self方法参数漏 self → TypeError修改类变量误改实例self.species “猫” 只改实例非类init拼写错int等 → 不调用继承时漏 super()父类属性未初始化多继承 MRO 混乱用 super()检查 mro()最佳实践类小而专一单一职责原则。用 dataclass (Python 3.7) 简化 boilerplate。优先组合 继承。文档字符串docstring描述类/方法。类型提示typing 模块提升可读性。fromdataclassesimportdataclassdataclassclassPoint:x:inty:int# 自动生成 __init__、__repr__ 等10. 小练习 面试题练习1写一个 BankAccount 类支持存款、取款、查询余额用私有属性 getter。练习2实现一个 Shape 抽象类子类 Circle 和 Rectangle 计算面积、周长。面试题解释 self 和 cls 的区别Python 如何实现多态new和init区别new创建实例init初始化什么是元类metaclass类的类type 是默认元类学完这些你已掌握 Python OOP 90% 精髓如果你想看完整练习答案深入某个话题如元类、装饰器在 OOP 中的用对比 Python OOP 与 C/Java 的异同还是来点项目实战如 OOP 实现的游戏告诉我继续陪你升级