@songying
2018-07-12T16:11:44.000000Z
字数 919
阅读 1342
python特殊方法
该部分包含三个方法: __new__
, __init__
, __del__
。
注意一点:在初始化一个类实例时(x = SomeClass()) , __init__
并非是最先调用的,第一个被调用的是__new__
方法,这个方法才真正创建了实例。
在一个对象的生命周期结束的时候,__del__
会被调用。
__new__(cls,[...)
__new__
是对象实例化时第一个调用的方法,它只取下 cls 参数,并把其他参数传给__init__
。__new__
很少使用,但是也有它适合的场景,尤其是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。我不打算深入讨论 __new__
,因为它并不是很有用, Python文档 中 有详细的说明。
__init__(self,[...])
类的初始化方法。它获取任何传给构造器的参数(比如我们调用 x = SomeClass(10, ‘foo’) ,__init__
就会接到参数 10 和 ‘foo’ 。 __init__
在Python的类定义中用的最多。
__del__(self)
__new__
和 __init__
是对象的构造器, __del__
是对象的销毁器。它并非实现了语句 del x (因此该语句不等同于 x.__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