Python中对象的创建与销毁 以及单例类工厂模式相关简述
文章参考: https://www.cnblogs.com/zhangchaoyang/articles/4984768.html
对象的创建
关于__new__ 和 init
在python的类中__new__方法先于__init__方法执行
__new__可以理解为类的实例方法,属于类级别的方法
__init__可以理解为类的初始化方法,属于对象(实例)级别的方法
因此在python中使用类,是用__new__来创建对象,实例对象之后会立即调用__init__方法来对对象属性进行变量初始化,或动态添加对象属性并赋值。
需要注意的是,在重写 new 方法与 init 方法的参数应该保持一致
class Student(object):
cnt = 0 # 用于记录该类的实例创建了多少个
def __new__(cls, *args, **kwargs):
print '__new__'
cls.cnt += 1
return super(Student, cls).__new__(cls, *args, **kwargs)
def __init__(self):
print '__init__'
self.name = 'ELE' + str(self.cnt)
if __name__ == '__main__':
inst1 = Student()
print
inst2 = Student()
print inst2.name
print Student.cnt
输出结果
__new__
__init__
__new__
__init__
ELE2
2
关于__call__
关于 call 方法,不得不先提到一个概念,就是可调用对象(callable),我们平时自定义的函数、内置函数和类都属于可调用对象,但凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable
如果在类中实现了 call 方法,那么实例对象也将成为一个可调用对象。
此处参考:https://www.jianshu.com/p/e1d95c4e1697
个人理解可以理解为调用对象的__call__方法,相当于是__call__重载了小括号运算符
对象的销毁
python是垃圾自动回收的,不需要我们显式的销毁对象,当没有引用指向内存中的对象时,即引用计数为0时自动销毁。
当执行del obj时会调用对象的__del__方法, 这时对象的引用计数会减1,当对象的引用计数为0时,对象会被销毁,内存就会被回收。
代码解释如下:
import gc
class A(object):
def __init__(self):
self.large_list=[i for i in xrange(10000000)]
def __del__(self):
print "__del__"
@profile
def foo():
a=A()
b=a
del b
del a
gc.collect()
print
if __name__ ==