python3中构造函数和析构函数的区别

  介绍

这篇文章将为大家详细讲解有关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中构造函数和析构函数的区别