构造方法和初始化
我们都知道一个最基本的魔术方法__init__
, 我们用他来定义一个对象的初始行为.
然而, 其实__init__
并不是当我们使用x = SomeClass()
来创建对象的时候第一个要调用的方法.
事实上, 第一个被调用的方法是__new__
, 这个方法才是真正的创建了对象. 然后才会把创建的对象传递给__init__
.
当这个对象的生命周期结束的时候, 还有一个__del__
方法被调用.
让我们进一步理解这 3 个方法.
__new__(cls, [...)
__new__
是对象实例化时第一个调用的方法,它只取下 cls 参数(表示 class 的参数),并把其他参数传给__init__
。对象就是在这个方法中创建的.
__new__
很少使用,但是也有它适合的场景,尤其是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。__init__(self, [...)
类的初始化方法。它获取任何传给构造器的参数(比如我们调用
x = SomeClass(10, ‘foo’)
,__init__
就会接到参数10
和foo
。__init__
在Python的类定义中用的最多。__del__(self)
如果把
__new__
和__init__
看成对象的构造器的话, 那么,__del__
就是对象的销毁器.他用来定义, 当对象被垃圾回收时的行为.
当对象需要在销毁时做一些处理的时候这个方法很有用,比如 socket 对象、文件对象。
但是需要注意的是,当Python解释器退出但对象仍然存活的时候, del 并不会 执行。
所以养成一个手工清理的好习惯是很重要的,比如及时关闭连接。
from os.path import join
class FileObject:
'''文件对象的装饰类,用来保证文件对象在内存中被删除时能够正确关闭。'''
def __init__(self, filepath='~', filename='sample.txt'):
# 使用读写模式打开filepath中的filename文件
self.file = open(join(filepath, filename), 'r+')
def __del__(self):
self.file.close()
del self.file