📝 本章学习目标
本章聚焦 Python 核心能力 ------面向对象编程 OOP,帮助你从零基础打通类、对象、封装、继承、多态、魔术方法、属性装饰器、设计模式基础等全套知识点,做到真正 "从入门到精通"。通过本章学习,你将全面掌握:
- OOP 核心思想、设计理念与适用场景
- 类与对象的定义、实例化、属性与方法完整体系
- 三大特性:封装、继承、多态底层原理与实战写法
- 构造函数、析构函数、
__str__、__repr__等全套魔术方法 - 实例属性、类属性、静态方法、类方法、实例方法区别与使用
- 私有属性、保护属性、
@property装饰器实现安全访问 - 单继承、多继承、MRO 方法解析顺序、
super()深度用法 - 面向对象实战案例:学生管理系统、图书管理、日志工具类
- 企业级 OOP 最佳实践、代码规范与常见坑
- 面试高频 OOP 真题精讲(含答案)
全文 5000+ 字,由浅入深、案例可直接运行,适合零基础入门、进阶复习、面试突击。
一、引言:为什么 OOP 是 Python 工程师必备能力
1.1 面向过程 vs 面向对象
在学习 OOP 之前,我们写代码大多是面向过程(POP):按步骤写逻辑,变量和函数分散,代码复用靠复制粘贴,项目变大后极难维护。
面向过程特点:
- 一步一步执行,顺序执行逻辑
- 数据和函数分离,耦合度低但复用性差
- 适合小脚本、简单逻辑
- 项目变大后:代码冗余、难以扩展、难以排查 Bug
面向对象特点:
- 以 "对象" 为核心,将数据和操作封装在一起
- 代码模块化、可复用、可扩展、可维护
- 适合中大型项目、框架开发、业务系统
- Django、Flask、Requests、Pandas 全部基于 OOP 构建
Python 设计之初就是完全面向对象语言 :整数、字符串、列表、函数......一切皆对象。不会 OOP,就无法真正读懂 Python 框架源码,也无法写出工程化代码。
1.2 OOP 能解决什么问题
- 代码复用:避免重复写相同逻辑
- 数据安全:通过封装保护内部属性,不被外部随意修改
- 结构清晰:业务按类划分,可读性极强
- 易于扩展:新增功能不改动原有代码(开闭原则)
- 适合团队协作:类与接口明确,多人开发不冲突
1.3 本章学习路线
plaintext
基础概念 → 类与对象 → 属性与方法 → 三大特性 → 魔术方法 → 高级特性 → 实战项目 → 面试题 → 最佳实践
二、OOP 核心基础概念
2.1 类(Class)与对象(Object)
什么是类?
类是一个模板 / 图纸 / 抽象概念。比如:"人" 是一个类,它有姓名、年龄,会吃饭、睡觉、工作。
什么是对象?
对象是类的具体实例(具体化)。比如:"张三""李四" 是 "人类" 创建出来的对象。
一句话总结:类是抽象的,对象是具体的;类定义结构,对象占用内存。
2.2 OOP 三大核心特性(必背)
- 封装:将属性和方法打包,隐藏内部实现,对外提供接口
- 继承:子类复用父类功能,减少重复代码
- 多态:不同对象对同一方法有不同实现,提高灵活性
2.3 基础术语一览
- 实例化:通过类创建对象的过程
- 属性:对象的特征变量(姓名、年龄、价格)
- 方法:对象的行为函数(跑、吃、计算、保存)
- self:代表当前对象本身,必须作为实例方法第一个参数
__init__:构造方法,创建对象时自动调用- 魔术方法:双下划线开头结尾的方法,控制对象行为
三、类与对象的定义与使用(入门核心)
3.1 定义一个最简单的类
语法:
python
运行
python
class 类名:
# 属性
# 方法
类名规范:大驼峰命名法 ,如 Person、Student、Car、OrderService。
示例:定义人类
python
运行
python
class Person:
# 构造方法
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age
# 实例方法
def introduce(self):
return f"大家好,我是{self.name},今年{self.age}岁"
3.2 实例化对象
python
运行
python
# 创建对象 = 实例化
p1 = Person("张三", 20)
p2 = Person("李四", 22)
# 调用方法
print(p1.introduce())
print(p2.introduce())
# 访问属性
print(p1.name)
print(p2.age)
执行结果:
plaintext
大家好,我是张三,今年20岁
大家好,我是李四,今年22岁
张三
22
3.3 深入理解 self
self 是 Python 自动传递的参数,代表当前调用方法的对象。
p1.introduce()→ 内部等价于introduce(p1)self就是对象本身- 谁调用,
self就是谁
没有 self,方法无法访问对象内部属性。
3.4 实例属性与实例方法
- 实例属性 :
self.xxx,每个对象独立拥有,互不影响 - 实例方法 :必须带
self,只能通过对象调用
四、属性与方法详解(进阶核心)
4.1 实例属性、类属性、局部变量
1)实例属性
python
运行
python
def __init__(self, name):
self.name = name # 实例属性
每个对象独有,互不干扰。
2)类属性(类变量)
定义在类内部、方法外部,所有对象共享。
python
运行
python
class Person:
species = "人类" # 类属性
def __init__(self, name):
self.name = name
调用:
python
运行
python
print(Person.species)
p1 = Person("张三")
print(p1.species)
3)局部变量
方法内部定义,只能在方法内部使用。
python
运行
python
def func(self):
a = 10 # 局部变量
4.2 三种方法:实例方法、类方法、静态方法
1)实例方法
- 第一个参数
self - 可访问实例属性、类属性
- 只能对象调用
python
运行
python
def introduce(self):
pass
2)类方法 @classmethod
- 第一个参数
cls代表类本身 - 可访问类属性,不能直接访问实例属性
- 可通过类或对象调用
python
运行
python
class Person:
count = 0
def __init__(self):
Person.count += 1
@classmethod
def get_count(cls):
return cls.count
3)静态方法 @staticmethod
- 无默认参数
self/cls - 不能访问实例属性与类属性
- 相当于类里的普通函数
python
运行
python
class Math:
@staticmethod
def add(a, b):
return a + b
print(Math.add(1,2))
4.3 私有属性与封装
Python 没有真正私有,但有命名规范:
name:公有属性_name:保护属性(约定不外部访问)__name:私有属性(名称改写,外部无法直接访问)
示例:
python
运行
python
class Student:
def __init__(self, name, score):
self.name = name # 公开
self._gender = "男" # 保护
self.__score = score # 私有
def get_score(self):
return self.__score
s = Student("小明", 95)
print(s.name)
print(s.get_score())
# print(s.__score) # 报错
封装意义:保护数据不被随意篡改。
4.4 @property 装饰器(优雅访问私有属性)
让你像访问属性一样调用方法,实现安全读写:
python
运行
python
class Student:
def __init__(self, score):
self.__score = score
@property
def score(self):
return self.__score
@score.setter
def score(self, value):
if 0 <= value <= 100:
self.__score = value
else:
raise ValueError("分数必须0-100")
s = Student(80)
print(s.score)
s.score = 90
# s.score = 150 # 抛异常
五、OOP 三大特性深度解析
5.1 封装(Encapsulation)
核心思想:对外隐藏实现,对内开放访问。
好处:
- 数据安全
- 降低耦合
- 方便修改内部逻辑不影响外部
- 提高代码可维护性
典型写法:
- 私有属性存储数据
- 提供
get/set方法或@property访问
5.2 继承(Inheritance)
子类自动拥有父类所有属性和方法,可重写或扩展。
单继承
python
运行
python
# 父类
class Animal:
def __init__(self, name):
self.name = name
def shout(self):
print("动物叫")
# 子类
class Dog(Animal):
def shout(self): # 方法重写
print("汪汪汪")
dog = Dog("旺财")
dog.shout()
多继承
python
运行
python
class A: pass
class B: pass
class C(A, B): pass
super () 调用父类方法
python
运行
python
class Student(Person):
def __init__(self, name, age, score):
super().__init__(name, age)
self.score = score
MRO 方法解析顺序
Python 使用 C3 算法 决定多继承调用顺序,可通过 类名.__mro__ 查看。
5.3 多态(Polymorphism)
不同对象,对同一消息做出不同响应。
Python 是鸭子类型,不强制继承关系,只要有同名方法即可实现多态。
python
运行
python
class Dog:
def speak(self):
print("汪汪")
class Cat:
def speak(self):
print("喵喵")
def make_speak(animal):
animal.speak()
make_speak(Dog())
make_speak(Cat())
优势:统一接口,灵活扩展。
六、魔术方法大全(精通必备)
魔术方法以 __xxx__ 形式存在,系统自动调用。
6.1 构造与析构
__init__(self):构造方法,初始化对象__del__(self):析构方法,对象销毁时执行
6.2 字符串显示
__str__(self):print()时显示(给用户看)__repr__(self):交互环境显示(给开发者看)
python
运行
python
class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Person:{self.name}"
p = Person("张三")
print(p)
6.3 长度、容器、运算
__len__:支持len(obj)__getitem__:支持下标obj[key]__add__:支持+__eq__:支持==__lt__:支持<
6.4 属性访问控制
__getattr__:访问不存在属性时触发__setattr__:设置属性时触发__delattr__:删除属性时触发
七、面向对象实战案例
7.1 案例 1:学生管理系统(完整可运行)
python
运行
python
class Student:
def __init__(self, sid, name, age, gender):
self.sid = sid
self.name = name
self.age = age
self.gender = gender
def __str__(self):
return f"学号:{self.sid} | 姓名:{self.name} | 年龄:{self.age} | 性别:{self.gender}"
class StudentManager:
def __init__(self):
self.stu_list = []
def add_student(self, student):
self.stu_list.append(student)
print(f"添加成功:{student.name}")
def show_all(self):
if not self.stu_list:
print("暂无学生")
return
for stu in self.stu_list:
print(stu)
def find_by_name(self, name):
res = [s for s in self.stu_list if name in s.name]
return res
if __name__ == "__main__":
manager = StudentManager()
manager.add_student(Student(101, "张三", 18, "男"))
manager.add_student(Student(102, "李四", 19, "女"))
manager.show_all()
7.2 案例 2:日志工具类
python
运行
python
class Logger:
@staticmethod
def info(msg):
print(f"[INFO] {msg}")
@staticmethod
def error(msg):
print(f"[ERROR] {msg}")
Logger.info("启动成功")
Logger.error("连接失败")
八、企业级 OOP 最佳实践
- 类名使用大驼峰,方法 / 变量使用下划线命名
- 一个类只负责一件事(单一职责原则)
- 尽量使用组合而非多层继承
- 私有属性用
__,内部用_ - 公开方法提供清晰注释
- 数据类优先使用
@dataclass - 避免过度设计,简单优先
- 实例方法、类方法、静态方法合理区分
九、面试高频 OOP 真题
1. 谈一下面向对象三大特性
封装、继承、多态,解释 + 举例。
2. self 作用是什么?
代表当前对象,绑定实例属性,访问对象自身成员。
3. __init__ 作用?
初始化对象属性,创建对象时自动调用。
4. 类属性和实例属性区别?
类属性所有对象共享;实例属性每个对象独立。
5. @staticmethod 和 @classmethod 区别?
静态方法无 self/cls;类方法有 cls,可访问类属性。
6. 什么是多态?Python 如何实现?
不同对象同名方法不同表现;鸭子类型实现。
7. 私有属性如何实现?
__attr,通过 property 访问。
8. 多继承 MRO 是什么?
方法解析顺序,C3 算法,__mro__ 查看。
十、总结
Python 面向对象编程是进入工程化开发的必经之路,也是面试必考重点。
从类的定义、实例化,到属性方法、三大特性,再到魔术方法与实战项目,本章完整覆盖 OOP 所有核心知识点。
学会 OOP,你将能够:
- 读懂各类 Python 框架源码
- 写出可复用、可维护的优质代码
- 轻松应对企业笔试面试
- 独立开发中小型业务系统
建议多敲代码、多写案例,从简单类开始,逐步实现复杂系统,真正做到从入门到精通。