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


Posted in Python onMarch 12, 2020

要点:

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 构造函数和析构函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的getopt函数使用详解
Jul 28 Python
Python 高级专用类方法的实例详解
Sep 11 Python
Django数据库表反向生成实例解析
Feb 06 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
对pandas中to_dict的用法详解
Jun 05 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
python中的colorlog库使用详解
Jul 05 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 Python
Python基于yield遍历多个可迭代对象
Mar 12 #Python
Python通过4种方式实现进程数据通信
Mar 12 #Python
Python多进程编程multiprocessing代码实例
Mar 12 #Python
Python多线程多进程实例对比解析
Mar 12 #Python
Python线程协作threading.Condition实现过程解析
Mar 12 #Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 #Python
Python基于read(size)方法读取超大文件
Mar 12 #Python
You might like
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
2017/03/15 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
python输出指定月份日历的方法
2015/04/23 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
python实现飞机大战微信小游戏
2020/03/21 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Python中的全局变量如何理解
2020/06/04 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
阿巴庭院:Abba Patio
2019/06/18 全球购物
让生命充满爱演讲稿
2014/05/10 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
项目合作协议书
2014/09/23 职场文书
解除同居协议书
2015/01/29 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书