Python构造函数与析构函数详解
本文深入解析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构造函数与析构函数的核心概念,更多相关内容可参考本站过往文章或继续浏览后续内容,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









