news 2026/5/1 9:00:28

Python之面向对象详解(一篇足矣)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python之面向对象详解(一篇足矣)

Python 面向对象编程(OOP)详解:一篇足矣(2026 年实用版)

前言:Python 的面向对象编程(OOP)是其核心特性之一,让代码更模块化、可复用、可维护。OOP 三大支柱:封装(Encapsulation)继承(Inheritance)多态(Polymorphism)。如果你是新手,别担心,我们从 0 基础开始,由浅入深。教程基于 Python 3.12+,包含代码示例(直接复制运行)。学完这篇,你能自信写出 80% 实际项目中的 OOP 代码。

我们分成这些模块学(建议按顺序):

  1. OOP 基础概念
  2. 类和对象创建
  3. 属性与方法
  4. 继承与多态
  5. 封装与访问控制
  6. 特殊方法(魔法方法)
  7. 类变量 vs 实例变量、静态/类方法
  8. 高级话题(抽象类、接口、多继承)
  9. 常见错误 & 最佳实践
  10. 小练习 & 面试题

1. OOP 基础概念(为什么用 OOP?)

  • 类(Class):蓝图/模板,比如“汽车”类定义了所有汽车的共同特征(颜色、速度)和行为(开车、刹车)。
  • 对象(Object):类的实例,比如一辆具体的“红色特斯拉”。
  • 为什么用 OOP
    • 复用:写一次类,到处创建对象。
    • 组织:大项目分模块。
    • 抽象:隐藏复杂细节,只露接口。
  • 生活比喻:类 = 手机模具,对象 = 你手里的 iPhone。

一句话:一切皆对象(Python 哲学),int、str、list 都是内置类。


2. 类和对象创建(最简单起步)

class关键字定义类。

# 定义类(类名首字母大写,驼峰式)classDog:pass# 空类,占位# 创建对象(实例化)my_dog=Dog()# my_dog 是 Dog 的实例print(type(my_dog))# 输出: <class '__main__.Dog'>

进阶:带初始化方法(__init__)。

classDog:def__init__(self,name,age):# self 是实例自身(必须第一个参数)self.name=name# 实例属性self.age=age# 创建对象my_dog=Dog("旺财",3)print(my_dog.name)# 输出: 旺财

Tips__init__不是构造函数(Python 没有严格构造函数),而是初始化方法。类定义时不执行,实例化时自动调用。


3. 属性与方法(类的核心内容)

  • 属性(Attribute):数据(如 name、age)。
  • 方法(Method):行为(如 bark、run)。
classDog:def__init__(self,name,age):self.name=name self.age=agedefbark(self):# 方法,self 必备print(f"{self.name}汪汪叫!")defrun(self,speed):print(f"{self.name}{speed}km/h 跑!")my_dog=Dog("旺财",3)my_dog.bark()# 输出: 旺财 汪汪叫!my_dog.run(20)# 输出: 旺财 以 20 km/h 跑!

属性分类

  • 实例属性:每个对象独立(如 self.name)。
  • 类属性:所有对象共享(见第 7 节)。

方法调用:总是对象.方法(),内部用 self 访问属性。


4. 继承与多态(代码复用神器)

  • 继承:子类继承父类属性/方法,可扩展/覆盖。
classAnimal:# 父类(基类)def__init__(self,species):self.species=speciesdefeat(self):print("吃东西...")classDog(Animal):# 子类(派生类),继承 Animaldef__init__(self,name,age):super().__init__("狗")# 调用父类 __init__self.name=name self.age=agedefbark(self):print(f"{self.name}汪汪!")defeat(self):# 方法覆盖(重写)print(f"{self.name}吃骨头!")# 多态体现my_dog=Dog("旺财",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.__balance=balance# 私有属性defdeposit(self,amount):self.__balance+=amountdefget_balance(self):# getter 方法returnself.__balance account=BankAccount(100)print(account.get_balance())# 100# print(account.__balance) # AttributeError(但可通过 _BankAccount__balance 访问,勿滥用)

@property(优雅 getter/setter,C++ 无等价):

classCircle:def__init__(self,radius):self.__radius=radius@propertydefradius(self):returnself.__radius@radius.setterdefradius(self,value):ifvalue<0:raiseValueError("半径不能负")self.__radius=value c=Circle(5)print(c.radius)# 5(像属性访问)c.radius=10# setter 调用

6. 特殊方法(魔法方法,Python OOP 的灵魂)

这些以__开头的双下划线方法,让类像内置类型一样行为。

常见魔法方法作用示例代码
init初始化如上
strprint 时调用return f"Dog: {self.name}"
reprrepr() 或调试时return f"Dog(‘{self.name}’, {self.age})"
lenlen(obj)return 长度
getitemobj[key]支持索引如列表
callobj() 如函数调用defcall(self): print(“调用!”)
addobj1 + obj2return self.value + other.value
classVector:def__init__(self,x,y):self.x=x self.y=ydef__add__(self,other):returnVector(self.x+other.x,self.y+other.y)def__str__(self):returnf"({self.x},{self.y})"v1=Vector(1,2)v2=Vector(3,4)print(v1+v2)# 输出: (4, 6)

Tips:魔法方法让类“鸭子类型”兼容(如自定义类支持 + 操作符)。


7. 类变量 vs 实例变量、静态/类方法

  • 类变量:类级共享,所有实例共用。
  • 实例变量:每个实例独立。
classDog:species="狗"# 类变量def__init__(self,name):self.name=name# 实例变量d1=Dog("旺财")d2=Dog("小黑")print(d1.species,d2.species)# 狗 狗Dog.species="Canine"# 修改类变量,所有实例变print(d1.species)# Canine
  • 静态方法:不访问 self/class,用 @staticmethod。
  • 类方法:访问类,用 @classmethod,第一个参数 cls。
classMathUtil:@staticmethoddefadd(a,b):returna+b# 无 self/cls@classmethoddeffrom_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.h=w,hdefarea(self):returnself.w*self.h r=Rectangle(2,3)print(r.area())# 6# Shape() # TypeError: Can't 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 模块)提升可读性。
fromdataclassesimportdataclass@dataclassclassPoint:x:inty:int# 自动生成 __init__、__repr__ 等

10. 小练习 & 面试题

练习1:写一个 BankAccount 类,支持存款、取款、查询余额(用私有属性 + getter)。

练习2:实现一个 Shape 抽象类,子类 Circle 和 Rectangle 计算面积、周长。

面试题

  • 解释 self 和 cls 的区别?
  • Python 如何实现多态?
  • newinit区别?(new创建实例,init初始化)
  • 什么是元类(metaclass)?(类的类,type 是默认元类)

学完这些,你已掌握 Python OOP 90% 精髓!如果你想:

  • 看完整练习答案?
  • 深入某个话题(如元类、装饰器在 OOP 中的用)?
  • 对比 Python OOP 与 C++/Java 的异同?
  • 还是来点项目实战(如 OOP 实现的游戏)?

告诉我,继续陪你升级~ 😊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:53:22

中国第一银楼低价甩卖,为何最终无人出价?

近日&#xff0c;位于湖南郴州市永兴县的地标建筑“永兴银楼”被低价拍卖。 关于这座银楼&#xff0c;有一个官方故事传说。 明末清初年间&#xff0c;一永兴人远赴南洋淘金&#xff0c;终日辛劳。 一日夜寐&#xff0c;梦见一老道士登上阁楼&#xff0c;目视阁楼地板&#…

作者头像 李华
网站建设 2026/4/23 23:25:32

加湿器!新房手脱皮!

安装空气净化器**有用,但它不是最直接的解决办法**。 对于“手掌脱皮干燥”这个问题,空气净化器只能解决**一半**的问题(空气中的刺激物),但它解决不了**另一半更关键**的问题(湿度)。 以下是详细的分析建议: ### 1. 空气净化器能帮你解决什么?(针对新房环境) 如…

作者头像 李华
网站建设 2026/4/30 17:18:36

区域创新生态的破局者:科技成果转化的全新路径

在当前全球科技创新竞争日益激烈的背景下&#xff0c;如何将实验室中的科技成果有效转化为实际生产力&#xff0c;已成为制约区域经济发展的关键问题。无论是政府科技口、产业园区&#xff0c;还是高校科研处和技术经纪人&#xff0c;都面临着科技成果供需信息不对称、转化渠道…

作者头像 李华
网站建设 2026/5/1 7:31:21

‌学工管理系统解决方案:让校园管理更高效,服务更贴心‌

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

作者头像 李华
网站建设 2026/4/30 20:14:03

智能多功能AI配音系统源码,支持导出行业标准的MP3格式

温馨提示&#xff1a;文末有资源获取方式在内容为王的时代&#xff0c;优质配音是提升作品感染力的关键。然而&#xff0c;专业配音的高成本与长周期往往让创作者望而却步。此刻&#xff0c;一款集创新技术与用户友好设计于一身的智能配音系统源码应运而生。它如同一个可随时启…

作者头像 李华