• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

浅谈python3 构造函数和析构函数

python 搞代码 4年前 (2022-01-07) 36次浏览 已收录 0个评论

这篇文章主要介绍了浅谈python3 构造函数和析构函数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

要点:

1、魔法方法,被__双下划线所包围

在适当的时候自动被调用

2、在创建一个对象的时候,一定会调用构造函数

3、 del析构函数,在del a对象的时候,并一定会调用该析构函数

只有当该对象的引用计数为0时才会调用析构函数,回收资源

析构函数被python的垃圾回收器销毁的时候调用。当某一个对象没有被引用时,垃圾回收器自动回收资源,调用析构函数

 #coding=utf-8 ''' 魔法方法,被__双下划线所包围 在适当的时候自动被调用 ''' #构造init、析构del class Rectangle: def __init__(self,x,y): self.x = x self.y = y print('构造') ''' del析构函数,并不是在del a对象的时候就会调用该析构函数 只有当该对象的引用计数为0时才会调用析构函数,回收资源 析构函数被python的垃圾回收器销毁的时候调用。当某一个对象没有被引用时,垃圾回收器自动回收资源,调用析构函数 ''' def __del__(self): print('析构') def getPeri(self): return (self.x + self.y)*2 def getArea(self): return self.x * self.y if __name__ == '__main__': rect = Rectangle(3,4) # a = rect.getArea() # b = rect.getPeri() # print(a,b) rect1 = rect del rect1 # del rect while 1: pass

补充知识:Python 类成员变量使用缺省值初始化时要注意的一个坑

Python 类成员变量使用缺省值初始化时要注意的一个坑

标签(空格分隔): python2.7 python 3.6

考虑到如下场景:

定义class A,class A 包含成员变量 l 和 d, l为数组, d 为字典;

在 class A 的构造函数中使用缺省参数初始化 A 的成员变量 l 和 d ;

具体代码如下:

 class A: 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时会遇到:

 class MyGrid(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 ... def AppendData(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) class MyFrame(wx.Frame): def __init(self, parent, title=""): wx.Frame.__init__(self, parent=parent, title=title) self.grid1 = MyGrid(self) self.grid2 = MyGrid(self) ... def onGridAddCallback(rows, force=False): if isinstance(rows, list) and len(rows) > 0: self.grid1.AppendData(rows, force) 

当更新来源gaodai$ma#com搞$$代**码)网gird1的内容时,gird2的成员变量 data 也发生了改变,因此导致异常

可选的解决方案: 避免使用缺省值初始化指针类型成员变量(list, dict …):

 class MyFrame(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 构造函数和析构函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持gaodaima搞代码网

以上就是浅谈python3 构造函数和析构函数的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:浅谈python3 构造函数和析构函数

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址