浅谈python3 构造函数和析构函数
要点:
1、魔法方法,被__双下划线所包围
在适当的时候自动被调用
2、在创建一个对象的时候,一定会调用构造函数
3、del析构函数,在dela对象的时候,并一定会调用该析构函数
只有当该对象的引用计数为0时才会调用析构函数,回收资源
析构函数被python的垃圾回收器销毁的时候调用。当某一个对象没有被引用时,垃圾回收器自动回收资源,调用析构函数
#coding=utf-8 ''' 魔法方法,被__双下划线所包围 在适当的时候自动被调用 ''' #构造init、析构del classRectangle: def__init__(self,x,y): self.x=x self.y=y print('构造') ''' del析构函数,并不是在dela对象的时候就会调用该析构函数 只有当该对象的引用计数为0时才会调用析构函数,回收资源 析构函数被python的垃圾回收器销毁的时候调用。当某一个对象没有被引用时,垃圾回收器自动回收资源,调用析构函数 ''' def__del__(self): print('析构') defgetPeri(self): return(self.x+self.y)*2 defgetArea(self): returnself.x*self.y if__name__=='__main__': rect=Rectangle(3,4) #a=rect.getArea() #b=rect.getPeri() #print(a,b) rect1=rect delrect1 #delrect while1: pass
补充知识:Python类成员变量使用缺省值初始化时要注意的一个坑
Python类成员变量使用缺省值初始化时要注意的一个坑
标签(空格分隔):python2.7python3.6
考虑到如下场景:
定义classA,classA包含成员变量l和d,l为数组,d为字典;
在classA的构造函数中使用缺省参数初始化A的成员变量l和d;
具体代码如下:
classA: def__init__(self,l=["name"],d={"key1":"test"}): self.l=l self.d=d
现在,在主逻辑函数中定义生成多个A的实例,构造时使用构造函数的缺省值:
if__name__=="__main__": a1=A() a2=A() print(id(a1.l),id(a1.d)) print(id(a2.l),id(a2.d))
输出的结果如下:
python2.7 (56305416L,56376040L) (56305416L,56376040L) python3.6 2036953558112 2036953558112
可以看出,使用缺省值初始化的2个A的实例中,对应的成员变量l和d指向了同一个地址
现在假设需要在主逻辑函数中分别操作实例a1和a2:
if__name__=="__main__": a1=A() a2=A() #print(id(a1.l),id(a1.d)) #print(id(a2.l),id(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['name','a','b','C','Xa']{'key1':'test','key':'value'}
a2['name','a','b','C','Xa']{'key1':'test','key':'value'}
只修改a1,但a2的成员变量同时也被改变了!
此问题实际场景中其中一个是在使用wxGride时会遇到:
classMyGrid(wx.grid.Grid): def__init__(self,parent,col_titles=["a","b","c"],data=[["1","2","3"]]): wx.grid.Grid__init__(self,parent=parent) self.col_titls=col_titles self.data=data ... defAppendData(self,rows=[],clear=Flase): self.data.extend(rows) msg=wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, 0, len(rows)) self.ProcessTableMessage(msg) classMyFrame(wx.Frame): def__init(self,parent,title=""): wx.Frame.__init__(self,parent=parent,title=title) self.grid1=MyGrid(self) self.grid2=MyGrid(self) ... defonGridAddCallback(rows,force=False): ifisinstance(rows,list)andlen(rows)>0: self.grid1.AppendData(rows,force)
当更新gird1的内容时,gird2的成员变量data也发生了改变,因此导致异常
可选的解决方案:避免使用缺省值初始化指针类型成员变量(list,dict…):
classMyFrame(wx.Frame): def__init(self,parent,title=""): wx.Frame.__init__(self,parent=parent,title=title) self.grid1=MyGrid(self,col_titles=["a","b","c"],data=[["1","2","3"]]) self.grid2=MyGrid(self,col_titles=["a","b","c"],data=[["1","2","3"]]) ...
以上这篇浅谈python3构造函数和析构函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。