要点:
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 构造函数和析构函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍浅谈jQuery构造函数分析,包括了浅谈jQuery构造函数分析的使用技巧和注意事项,需要的朋友参考一下 在我的上一篇文章里面 阐述了jQuery的大致框架,知道了所有代码都是写在了一个自调用匿名函数里面,并且传入了window对象,源码是这样的: 我们通过alert(jquery) 知道它是一个对象,那么这个对象是怎么构造出来的呢?我们使用$(document)类似的写法获取元素,
类构造函数 类constructor是类的特殊成员函数,只要我们创建该类的新对象,就会执行该函数。 构造函数与类具有完全相同的名称,它根本没有任何返回类型,甚至无效。 构造函数对于为某些成员变量设置初始值非常有用。 下面的例子解释了构造函数的概念 - #include <iostream> using namespace std; class Line { public: voi
类构造函数 类constructor是类的特殊成员函数,只要我们创建该类的新对象,就会执行该函数。 构造函数与类具有完全相同的名称,并且根本没有任何返回类型,甚至无效。 构造函数对于为某些成员变量设置初始值非常有用。 以下示例解释了构造函数的概念 - import std.stdio; class Line { public: void setLength( double l
本文向大家介绍php构造函数与析构函数,包括了php构造函数与析构函数的使用技巧和注意事项,需要的朋友参考一下 php构造函数是对象创建完成后,第一个自动调用的方法,析构函数是当对象被释放之前最后一个自动调用的方法。本文章向大家介绍php构造函数与析构函数。 php构造函数 1.是对象创建完成后,“第一个”“自动调用”的方法 2.构造方法的定义,方法名是一个固定的, 在php4中:和类名相同的方法
C++ 类 & 对象 类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地理解构造函数的概念:#include <iostream> using namespace std; class Line { public: v
类 类是对某一事物的抽象描述,具体地讲,类是C++中的一种构造的数据类型。它即可包含描述事物的数据,又可包含处理这些数据的函数,类在程序运行时是被用作样板来建立对象的。所以要建立对象,首先必须定义类。 定义类 定义一个类的一般格式为: class 类名{ private: 成员表1; public: 成员表2; protected:
本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问
问题内容: 我开始学习JAXB,所以我的问题可能很愚蠢。现在我有了类,想要生成XML Schema。在执行此指令后,我得到了异常 IllegalAnnotationExceptions …没有无参数的默认构造函数。 是的 我的课程没有默认的无参数构造函数。太容易了 我有类与包可见的构造函数/ final方法和偏离路线的参数。我应该怎么做-创建一些特定的momemto / builder类或将我的构