Python编程实战——面向对象与进阶语法 | 构造函数与析构函数

一、引言:对象的"出生"与"消亡"

在现实世界中,万物都有生命周期: 出生 → 活动 → 消亡。

同样,在 Python 的面向对象世界中,对象(Object) 也有自己的"生命历程"。 当对象被创建时,系统会自动调用构造函数(Constructor) ; 当对象被销毁时,系统会调用析构函数(Destructor)

这两个特殊方法帮助我们在对象创建和销毁的时刻执行必要的初始化或清理操作


二、构造函数(__init__()

1. 定义与作用

构造函数用于在对象创建时自动执行,用于:

  • 初始化对象的属性;
  • 执行必要的准备操作。

定义格式如下:

python 复制代码
class 类名:
    def __init__(self, 参数列表):
        初始化语句

当创建对象时:

python 复制代码
对象名 = 类名(参数)

Python 会自动调用 __init__() 方法。


2. 基本示例

python 复制代码
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("一个Person对象被创建了!")

p = Person("张三", 20)
print(p.name, p.age)

输出:

复制代码
一个Person对象被创建了!
张三 20

__init__() 相当于对象的"出生证明",为新生的对象设定状态。


3. 构造函数中的 self

self 代表当前对象本身,通过它可以访问或绑定实例属性。

python 复制代码
class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):
        print(f"{self.name}:汪汪汪!")

dog = Dog("旺财")
dog.bark()

输出:

复制代码
旺财:汪汪汪!

4. 默认构造函数

如果类中没有定义 __init__(),Python 会自动提供一个"默认构造函数",什么也不做。

python 复制代码
class Empty:
    pass

obj = Empty()
print("对象已创建!")

输出:

复制代码
对象已创建!

当不需要初始化逻辑时,可以不定义构造函数。


5. 构造函数的参数默认值

可以给参数设置默认值,让对象创建更灵活:

python 复制代码
class Student:
    def __init__(self, name="未命名", grade="未知"):
        self.name = name
        self.grade = grade

s1 = Student()
s2 = Student("小明", "高一")

print(s1.name, s1.grade)  # 未命名 未知
print(s2.name, s2.grade)  # 小明 高一

6. 在构造函数中调用其他方法

构造函数不仅可以初始化属性,也可以在创建时执行行为。

python 复制代码
class File:
    def __init__(self, filename):
        self.filename = filename
        self.open_file()

    def open_file(self):
        print(f"文件 {self.filename} 已打开")

f = File("data.txt")

输出:

kotlin 复制代码
文件 data.txt 已打开

三、析构函数(__del__()

1. 定义与作用

析构函数用于在对象被销毁前执行清理工作,例如:

  • 关闭文件;
  • 释放网络连接;
  • 打印日志或调试信息。

定义格式:

python 复制代码
class 类名:
    def __del__(self):
        清理操作

当对象的引用计数归零时,Python 会自动调用 __del__()


2. 基本示例

python 复制代码
class Person:
    def __init__(self, name):
        self.name = name
        print(f"{self.name} 出生了")

    def __del__(self):
        print(f"{self.name} 离开了世界")

p1 = Person("张三")
p2 = Person("李四")

del p1  # 主动删除对象
print("程序执行完毕")

输出示例:

复制代码
张三 出生了
李四 出生了
张三 离开了世界
程序执行完毕
李四 离开了世界

3. 析构函数的自动调用时机

Python 使用**垃圾回收机制(Garbage Collection)**来管理内存。 当对象不再被引用时(引用计数为0),__del__() 会被自动调用。

python 复制代码
def test():
    a = Person("王五")

test()  # 函数执行完毕后,局部变量 a 被销毁
print("函数结束")

输出:

复制代码
王五 出生了
王五 离开了世界
函数结束

4. 析构函数的注意事项

  • 不要在析构函数中执行复杂逻辑,因为调用时机可能不确定;
  • 对象间循环引用会延迟或阻止析构;
  • Python 程序结束时会清理所有对象,但执行顺序不可预测。

四、构造与析构的协作------对象的生命周期

对象的完整生命周期:

  1. 创建阶段

    • 调用 __init__() 构造函数;
    • 初始化属性;
    • 执行启动逻辑。
  2. 使用阶段

    • 对象参与运算、函数调用;
    • 可能被多处引用。
  3. 销毁阶段

    • 引用计数归零;
    • 调用 __del__()
    • 释放资源。

示例:

python 复制代码
class Life:
    def __init__(self, name):
        self.name = name
        print(f"{self.name} 诞生了")

    def __del__(self):
        print(f"{self.name} 消亡了")

a = Life("A")
b = Life("B")
a = None
print("执行中...")
b = None

输出:

css 复制代码
A 诞生了
B 诞生了
A 消亡了
执行中...
B 消亡了

五、构造与析构在实际开发中的应用场景

1. 文件资源管理

python 复制代码
class FileHandler:
    def __init__(self, path):
        self.file = open(path, "w", encoding="utf-8")
        print("文件已打开")

    def write(self, text):
        self.file.write(text)

    def __del__(self):
        self.file.close()
        print("文件已关闭")

f = FileHandler("test.txt")
f.write("Hello Python!")

当程序结束或对象被删除时,文件会自动关闭。


2. 数据库连接管理

python 复制代码
class DBConnection:
    def __init__(self):
        print("数据库连接已建立")

    def query(self):
        print("执行SQL查询...")

    def __del__(self):
        print("数据库连接已关闭")

conn = DBConnection()
conn.query()

六、小结

函数 名称 调用时机 作用
__init__() 构造函数 创建对象时 初始化对象属性
__del__() 析构函数 对象销毁前 清理资源或关闭连接

提示:

  • 构造函数几乎在每个类中都会使用;
  • 析构函数适合管理文件、网络等有限资源;
  • 如果使用 with 语句或上下文管理器(Context Manager),推荐使用 __enter____exit__ 替代析构函数。

七、结语

构造函数与析构函数,是 Python 对象生命周期中最重要的"开始"与"结束"。

__init__ 让对象诞生时充满灵魂, __del__ 让对象离开时井然有序。

理解这两者,意味着你真正掌握了对象的生命节奏。


相关推荐
段一凡-华北理工大学9 分钟前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
万粉变现经纪人12 分钟前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
小码哥_常19 分钟前
Spring Boot:别再重复造轮子,这些内置功能香麻了
后端
其实防守也摸鱼29 分钟前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
皮皮林5511 小时前
OpenFeign 首次调用卡 3 秒?八年老开发扒透 5 个坑,实战优化到 100ms!
后端
callJJ1 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
小郑加油1 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦1 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
.柒宇.2 小时前
AI掘金头条项目-K8s部署实战教程
python·云原生·容器·kubernetes·fastapi
观北海2 小时前
从 Sim2Sim 到 Sim2Real:以 ONNX 为核心的机器人策略实机落地全指南
python·机器人