经常遇到Python初学者反馈 “面向对象太难懂”“学了不会用”。其实 Python 面向对象的核心是 “模拟现实世界”,只要抓住 “实体 - 属性 - 动作” 的逻辑,就能轻松上手。本文基于系统的 Python 面向对象教程,提炼核心知识点,用通俗解读 + 实战案例的方式,帮你从思想到代码彻底掌握,真正做到灵活运用。

目录

一、先搞懂:面向对象到底是什么思想?

1.1 面向过程 vs 面向对象

1.2 核心思想

二、基础概念:类与对象是核心

2.1 类与对象:模板和实例

2.2 类的定义与实例化(Python 语法)

2.2.1 类的定义

2.2.2 实例化(创建对象)

2.3 self 关键字:对象的 “代词”

三、对象属性:怎么存、怎么取?

3.1 类外部添加和获取属性

3.2 类内部访问外部添加的属性

3.3 初始化属性:用__init__方法(推荐)

3.3.1 __init__的核心特点

四、必学魔术方法:让对象更 “智能”

4.1 什么是魔术方法?

4.2 三大核心魔术方法

4.2.1 __str__方法:自定义打印格式

4.2.2 __del__方法:释放资源


一、先搞懂:面向对象到底是什么思想?

在学具体语法前,先建立思维认知 —— 面向对象不是 “新技术”,而是 “解决问题的思维方式”。

1.1 面向过程 vs 面向对象

  • 面向过程:核心是 “步骤”,思维是 “自顶向下,逐步细化”。比如实现 “学生报名系统”,面向过程的思路是:

    1. 学生提交资料 → 2. 学生缴费 → 3. 教师登记 → 4. 班级添加信息把每个步骤写成函数,按顺序调用即可。特点:简单直接,适合小型任务,但修改、扩展难(比如加 “学校审核” 步骤,要改整个流程)。
  • 面向对象:核心是 “实体”,思维是 “先找主体,再封装功能”。同样是报名系统,面向对象的思路是:

    1. 先找 “实体”:学生、学校、教师、班级(所有动作的执行者);
    2. 给每个实体加 “属性”(特征)和 “方法”(能做的动作):
      • 学生:属性(姓名、资料)、方法(提交资料、缴费);
      • 教师:属性(工号)、方法(登记信息、分配班级);
    3. 让实体按逻辑执行方法:学生。提交资料 () → 学生。缴费 () → 教师。登记信息 ()。特点:贴近现实,适合复杂系统,修改扩展简单(加 “学校审核”,只需新增 “学校” 实体的方法)。

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__自动触发,关闭文件
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐