这篇文章将为大家详细讲解有关python3中构造函数和析构函数的区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>要点:强>
1,魔法方法,被__双下划线所包围
在适当的时候自动被调用
2,在创建一个对象的时候,一定会调用构造函数
3,德尔析构函数,在德尔的对象的时候,并一定会调用该析构函数
只有当该对象的引用计数为0时才会调用析构函数,回收资源
析构函数被python的垃圾回收器销毁的时候调用。当某一个对象没有被引用时,垃圾回收器自动回收资源,调用析构函数
#=utf - 8编码 & # 39;& # 39;& # 39; 魔法方法,被__双下划线所包围 在适当的时候自动被调用 & # 39;& # 39;& # 39; #构造init,析构德尔 class 矩形: def 才能__init__(自我,x, y): ,,,self.x =, x ,,,self.y =y ,,,print(& # 39;构造& # 39;) & # 39;才能& # 39;& # 39; 德尔才能析构函数,并不是在del 一个对象的时候就会调用该析构函数 只才能有当该对象的引用计数为0时才会调用析构函数,回收资源 ,,析构函数被python的垃圾回收器销毁的时候调用。当某一个对象没有被引用时,垃圾回收器自动回收资源,调用析构函数 & # 39;才能& # 39;& # 39; def 才能__del__(自我): ,,,print(& # 39;析构& # 39;) def 才能getPeri(自我): ,,,return (时间+ self.x self.y) * 2 def 才能getArea(自我): ,,,return self.x * self.y if __name__ ==, & # 39; __main__ # 39;: rect 才能=,矩形(3、4) #,才能a =, rect.getArea () #,才能b =, rect.getPeri () #,才能打印(a, b) rect1 才能=矩形 del 通过rect1才能 #,才能del 矩形 while 才能;1: ,,,通过
<强>补充知识:Python类成员变量使用缺省值初始化时要注意的一个坑强>
Python类成员变量使用缺省值初始化时要注意的一个坑
标签(空格分隔):python2.7 Python 3.6
<强>考虑到如下场景:强>
定义类A, A类包含成员变量l和d, l为数组,d为字典;
在A类的构造函数中使用缺省参数初始化一的成员变量l和d;
具体代码如下:
class 答: def 才能;__init__(自我,,l=(“name"), d={“key1":“test"}): ,,,self.l =, l ,,,self.d =, d
现在,在主逻辑函数中定义生成多一个的实例,构造时使用构造函数的缺省值:
if __name__ ==,“__main__": a1 才能=,() a2 才能=,() print 才能;(id (a1.l),身份证(a1.d)) print 才能;(id (a2.l),身份证(a2.d))
输出的结果如下:
python2.7 (56305416 l, 56376040 l), (56305416 l, 56376040 l) python3.6 ,2036953558112 以前,2036953558112 >可以看出,使用缺省值初始化的2个的实例中,对应的成员变量l和d指向了同一个地址
现在假设需要在主逻辑函数中分别操作实例a1和a2:
if __name__ ==,“__main__": a1 才能=,() a2 才能=,() #,才能print (id (a1.l),身份证(a1.d)) #,才能print (id (a2.l),身份证(a2.d)) a1.l.extend才能([“a",,“b",,“C",,“Xa"]) a1.d才能[“key"],=,“value" print 才能;(“a1",, a1.l,, a1.d) print 才能;(“a2",, a2.l,, a2.d)输出结果会如下:
a1(& # 39;名字# 39;& # 39;一个# 39;,& # 39;b # 39;, & # 39; c # 39;, & # 39; xa # 39;] {& # 39; key1& # 39;: & # 39;测试# 39;,& # 39;关键# 39;:& # 39;价值# 39;}
a2(& # 39;名字# 39;& # 39;一个# 39;,& # 39;b # 39;, & # 39; c # 39;, & # 39; xa # 39;] {& # 39; key1& # 39;: & # 39;测试# 39;,& # 39;关键# 39;:& # 39;价值# 39;}只修改a1,但a2的成员变量同时也被改变了!
此问题实际场景中其中一个是在使用wxGride时会遇到:
class MyGrid (wx.grid.Grid): def 才能;__init__(自我,,母公司,col_titles=[“a",,“b",,“c"],, data=https://www.yisu.com/zixun/[[“1”、“2”、“3”))): wx.grid。Grid__init__(自我、父母=父母) 自我。col_titls=col_titles 自我。=数据 … def方法(自我,行=[],清楚=误): self.data.extend(行) 味精=wx.grid.GridTableMessage(自我, wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, 0, len(行)) self.ProcessTableMessage(味精) 类MyFrame (wx.Frame): def __init(自我、父母、标题=" "): wx.Frame。__init__(自我、父母=父标题=标题) 自我。grid1=MyGrid(自我) 自我。grid2=MyGrid(自我) … def onGridAddCallback(行,力=False): 如果isinstance(行、列)和len(行)> 0: self.grid1。方法行,迫使)python3中构造函数和析构函数的区别