要点:
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)
当更新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 构造函数和析构函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]