Python 面向对象基础全解析:从思想到实战,让你真正学会举一反三
经常遇到Python初学者反馈 “面向对象太难懂”“学了不会用”。其实 Python 面向对象的核心是 “模拟现实世界”,只要抓住 “实体 - 属性 - 动作” 的逻辑,就能轻松上手。本文基于系统的 Python 面向对象教程,提炼核心知识点,用通俗解读 + 实战案例的方式,帮你从思想到代码彻底掌握,真正做到灵活运用。
目录
一、先搞懂:面向对象到底是什么思想?
在学具体语法前,先建立思维认知 —— 面向对象不是 “新技术”,而是 “解决问题的思维方式”。
1.1 面向过程 vs 面向对象
-
面向过程:核心是 “步骤”,思维是 “自顶向下,逐步细化”。比如实现 “学生报名系统”,面向过程的思路是:
- 学生提交资料 → 2. 学生缴费 → 3. 教师登记 → 4. 班级添加信息把每个步骤写成函数,按顺序调用即可。特点:简单直接,适合小型任务,但修改、扩展难(比如加 “学校审核” 步骤,要改整个流程)。
-
面向对象:核心是 “实体”,思维是 “先找主体,再封装功能”。同样是报名系统,面向对象的思路是:
- 先找 “实体”:学生、学校、教师、班级(所有动作的执行者);
- 给每个实体加 “属性”(特征)和 “方法”(能做的动作):
- 学生:属性(姓名、资料)、方法(提交资料、缴费);
- 教师:属性(工号)、方法(登记信息、分配班级);
- 让实体按逻辑执行方法:学生。提交资料 () → 学生。缴费 () → 教师。登记信息 ()。特点:贴近现实,适合复杂系统,修改扩展简单(加 “学校审核”,只需新增 “学校” 实体的方法)。
1.2 核心思想
面向对象的本质是 “封装主体”—— 不仅仅是把功能写成函数,更是把 “谁来执行这个功能” 和 “执行需要的信息” 打包在一起。一句话总结:先有 “谁”(实体 / 对象),再有 “做什么”(方法),最后 “用什么做”(属性)。
二、基础概念:类与对象是核心
面向对象的两个核心概念 ——类和对象,搞懂它们的关系,就入门了一半。
2.1 类与对象:模板和实例
- 类(Class):是 “抽象模板”,定义了某类实体的共同属性和方法。比如 “人类” 就是一个类:共同属性(姓名、年龄),共同方法(吃饭、说话)。
- 对象(Object):是 “具体实例”,是类的实际化产物。比如 “张三”“李四” 都是 “人类” 这个类的对象,有自己的具体属性(张三 20 岁,李四 30 岁)。
关系比喻:类是 “房子设计图”,对象是 “按图纸盖好的房子”—— 图纸规定了房子的结构(属性)和功能(方法),但每个房子可以有不同的装修(具体属性值)。
2.2 类的定义与实例化(Python 语法)
2.2.1 类的定义
Python3 中默认是 “新式类”(继承自 object),语法如下:
class 类名( object ): # 类名用大驼峰(如Person,而非person)
# 属性(变量)
# 方法(函数)
def 方法名(self, 参数):
方法体
示例:定义 “人类” 类:
class Person(object):
# 方法:说话
def speak(self):
print("我是人类,会说话")
2.2.2 实例化(创建对象)
不需要 new 关键字,直接用类名()即可:
# 实例化对象:张三是Person类的对象
zhangsan = Person()
# 调用对象的方法
zhangsan.speak() # 输出:我是人类,会说话
# 再创建一个对象:李四
lisi = Person()
lisi.speak() # 输出:我是人类,会说话
注意:类本身不占内存,只有实例化后的对象才占内存(图纸不占空间,房子才占空间)。
2.3 self 关键字:对象的 “代词”
初学者最困惑的self,其实很简单:
- 作用:指代 “当前实例化的对象”,相当于 “我”。
- 特点:方法的第一个参数必须是
self,Python 会自动传递当前对象,不需要手动传参。
示例:用 self 访问对象属性
class Person(object):
def set_name(self, name):
# self.name 表示“当前对象的name属性”
self.name = name
def speak(self):
# 访问当前对象的name属性
print(f"我叫{self.name}")
zhangsan = Person()
zhangsan.set_name("张三") # 无需传self,Python自动传递zhangsan对象
zhangsan.speak() # 输出:我叫张三
lisi = Person()
lisi.set_name("李四")
lisi.speak() # 输出:我叫李四
通俗解读:当 zhangsan 调用 set_name 时,self 就是 zhangsan;当 lisi 调用时,self 就是 lisi——self 永远指向 “调用方法的那个对象”。
三、对象属性:怎么存、怎么取?
属性是对象的 “特征数据”(如姓名、年龄),Python 中属性的操作分 3 种场景:
3.1 类外部添加和获取属性
直接用对象.属性名 = 值添加,对象.属性名获取:
class Person(object):
pass # 空类,暂时没有属性和方法
# 实例化对象
wangwu = Person()
# 外部添加属性
wangwu.name = "王五"
wangwu.age = 25
# 外部获取属性
print(f"姓名:{wangwu.name},年龄:{wangwu.age}") # 输出:姓名:王五,年龄:25
缺点:每次创建对象都要手动加属性,繁琐且容易遗漏(比如忘了加 age)。
3.2 类内部访问外部添加的属性
通过self.属性名访问(前提是外部已经添加了该属性):
class Person(object):
def introduce(self):
# 访问外部添加的name和age属性
print(f"我叫{self.name},今年{self.age}岁")
zhaoliu = Person()
zhaoliu.name = "赵六"
zhaoliu.age = 30
zhaoliu.introduce() # 输出:我叫赵六,今年30岁
3.3 初始化属性:用__init__方法(推荐)
为了解决 “手动添加属性繁琐” 的问题,用__init__方法(初始化方法),在对象创建时自动添加属性。
3.3.1 __init__的核心特点
- 触发时机:实例化对象时自动调用(不用手动调用);
- 作用:给对象 “出生即自带” 的属性;
- 语法:第一个参数是 self,后续参数是要初始化的属性。
示例:初始化时直接给对象加属性
class Person(object):
# 初始化方法:name和age是必填参数
def __init__(self, name, age):
self.name = name # 给当前对象绑定name属性
self.age = age # 给当前对象绑定age属性
def introduce(self):
print(f"我叫{self.name},今年{self.age}岁")
# 实例化时必须传name和age参数(self不用传)
qianqi = Person("钱七", 28)
qianqi.introduce() # 输出:我叫钱七,今年28岁
ba ba = Person("王八", 35)
ba ba.introduce() # 输出:我叫王八,今年35岁
解读:现在创建对象时,必须传入 name 和 age,避免了遗漏属性的问题,代码更规范。
四、必学魔术方法:让对象更 “智能”
魔术方法是 Python 中自带的、以__开头和结尾的方法,有特殊触发时机和功能,核心掌握 3 个即可:
4.1 什么是魔术方法?
魔术方法的核心是 “自动触发”—— 不需要你调用,满足条件就会执行。比如__init__是创建对象时触发,__str__是打印对象时触发。
4.2 三大核心魔术方法
| 方法名 | 触发时机 | 核心作用 |
|---|---|---|
__init__ |
对象实例化时 | 初始化属性(给对象 “赋初始值”) |
__str__ |
print(对象)或str(对象) |
自定义对象的打印格式(默认打印内存地址) |
__del__ |
对象被删除或程序结束时 | 释放资源(如关闭文件、数据库连接) |
4.2.1 __str__方法:自定义打印格式
默认情况下,print 对象会输出内存地址,毫无意义,用__str__优化:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 自定义打印格式:必须返回字符串
def __str__(self):
return f"[Person] 姓名:{self.name},年龄:{self.age}"
person = Person("小明", 20)
print(person) # 输出:[Person] 姓名:小明,年龄:20(而非内存地址)
注意:__str__必须返回字符串,否则会报错。
4.2.2 __del__方法:释放资源
实际开发中常用于关闭文件、数据库连接等,避免资源泄露:
class FileHandler(object):
def __init__(self, filename):
# 打开文件(占用资源)
self.file = open(filename, "r", encoding="utf-8")
def read(self):
return self.file.read()
# 对象被删除时触发:关闭文件
def __del__(self):
self.file.close()
print("文件已关闭,资源释放")
# 实例化对象:打开文件
fh = FileHandler("test.txt")
print(fh.read()) # 读取文件内容
# 程序结束时,__del__自动触发,关闭文件更多推荐

所有评论(0)