Python构造函数与析构函数详解

木白
木白
发布时间:2026-10-16| 3人浏览过
原创

本文深入解析Python中的构造函数__init__与析构函数__del__。通过Baby类示例说明__init__在实例化时自动调用及属性绑定机制,并演示解决属性未初始化报错的两种方案。同时介绍__del__在对象销毁或作用域结束时释放资源的用法,结合MySQL连接类展示实际应用场景。

1.构造函数

在类定义中,__init__(self)被称为构造函数,它会在对象实例化过程中被自动调用。

如果该函数内部包含打印语句,那么在创建实例时,这些提示信息将会被输出。

__init__方法的第一个参数始终为self,它代表当前创建的实例对象。在__init__方法内部,可以通过self将各种属性绑定到该实例上,因为self指向的就是正在创建的实例本身。

定义了__init__方法后,创建实例时就不能再传入空参数,必须提供与__init__方法签名相匹配的参数。需要注意的是,self参数无需手动传递,Python解释器会自动将实例变量传入。

def __init__():
        pass
lass Baby:
    def __init__(self,name):#构造函数
        self.name = name
    def cry(self):
        self.action = '哭了'
        print(self.action)
feng = Baby('小红')
print(feng.name)#实例化时构造函数自动执行,
print(feng.action)#cry方法未被执行,直接调用feng.action会报错,object has no attribute对象没有该属性

若cry方法未被执行,直接访问feng.action属性会引发报错,提示“object has no attribute”(对象没有该属性)。针对此问题,有以下两种解决思路:

(1)在实例化对象后,先手动调用cry方法,然后再打印feng.action属性。

class Baby:
    def __init__(self,name):#构造函数
        self.name = name
    def cry(self):
        self.action = '哭了'
        print(self.action)
feng = Baby('小红')
feng.cry()#先调用cry这个方法
print(feng.action)

(2)将cry方法的调用逻辑移至构造函数内部,这样在实例化时该方法会自动执行,从而生成feng.action属性。

class Baby:
    def __init__(self,name):#构造函数
        self.name = name
        self.cry()#将cry这个方法放在构造函数里
    def cry(self):
        self.action = '哭了'
        print(self.action)
feng = Baby('小红')
print(feng.action)

2.析构函数

__del__(self)被称为析构函数,它在实例被销毁时自动调用。

当使用del语句删除对象时,会触发其对应的析构函数。此外,当对象在某个作用域中执行完毕并跳出该作用域时,析构函数也会被调用一次,这有助于释放占用的内存空间。

析构函数:在实例被销毁时执行,并非必须定义。

 def __del__():
        pass
import pymysql
class MySQL(object):
    def __init__(self,host,user,passwd,db,port=3306,charset='utf8'):#构造函数,类实例化的时候执行
        try:
            self.conn = pymysql.connect(
                host = host,user=user,passwd=passwd,db=db,port=port,charset=charset,
                autocommit=True  # 自动提交,执行insert,update语句时,可以自动提交
            )
        except Exception as e:
            print('数据库连接失败,%s'%e)
        else:
            self.cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
    def __del__(self):#析构函数,实例被销毁的时候执行
        self.cur.close()
        self.conn.close()
        print('数据库连接关闭')
    def ex_sql(self,sql):
        try:
            self.cur.execute(sql)
        except Exception as e:
            print('sql语句错误,%s'%sql)
        else:
            self.res = self.cur.fetchall()
            return self.res #有没有返回值都可以
my = MySQL('127.0.0.1', 'root', '123456', 'data')
my.ex_sql('select * from stu')
print(my.res)#可以用实例属性取值
# print(my.ex_sql('select * from stu'))#也可以用实例方法的返回值
print('我是最后一行代码')#执行完最后一行代码,数据库连接关闭

本文介绍了Python构造函数与析构函数的核心概念,更多相关内容可参考本站过往文章或继续浏览后续内容,感谢支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。