python特殊方法(magic方法也叫魔术方法)
构造和初始化
每个人都知道一个最基本的魔术方法, __init__ 。
通过此方法我们可以定义一个对象的初始操作。
然而,当我调用 x = SomeClass() 的时候, __init__ 并不是第一个被调用的方法。
实际上,还有一个叫做 __new__ 的方法,来构造这个实例。
然后给在开始创建时候的初始化函数来传递参数。
在对象生命周期的另一端,也有一个 __del__ 方法。我们现在来近距离的看一看这三个方法:
__new__(cls, [...) __new__ 是在一个对象实例化的时候所调用的第一个方法。它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法。 __new__ 方法相当不常用,但是它有自己的特性,特别是当继承一个不可变的类型比如一个tuple或者string。我不希望在 __new__ 上有太多细节,因为并不是很有用处,但是在 Python文档 中有详细的阐述。
__init__(self, […) 此方法为类的初始化方法。当构造函数被调用的时候的任何参数都将会传给它。(比如如果我们调用 x = SomeClass(10, 'foo')),那么 __init__ 将会得到两个参数10和foo。 __init__ 在Python的类定义中被广泛用到。
__del__(self) 如果 __new__ 和 __init__ 是对象的构造器的话,那么 __del__ 就是析构器。它不实现语句 del x (以上代码将不会翻译为 x.__del__() )。它定义的是当一个对象进行垃圾回收时候的行为。当一个对象在删除的时需要更多的清洁工作的时候此方法会很有用,比如套接字对象或者是文件对象。注意,如果解释器退出的时候对象还存存在,就不能保证 __del__ 能够被执行,所以 __del__ can’t serve as a replacement for good coding practices ()~~~~~~~
放在一起的话,这里是一个 __init__ 和 __del__
实际使用的例子
from os.path import join
class FileObject:
'''给文件对象进行包装从而确认在删除时文件流关闭'''
def __init__(self, filepath='~', filename='sample.txt'):
#读写模式打开一个文件
self.file = open(join(filepath, filename), 'r+')
def __del__(self):
self.file.close()
del self.file