google 微软 Android Python php apache wordpress 编程 centos 程序员 java mysql Windows linux 云计算 shell nginx 开源 Firefox Ubuntu

Python的神奇方法指南:构建和初始化

相信大家都熟悉这个最基础的神奇方法 __init__。它令你能自定义一个对象的初始化行为。而当我调用x=SomeClass() 时,__init__ 并不是最先被调用的。实际上有一个叫做 __new__ 的方法,事实上是它创建了实例,它传递任何参数给初始化程序来达到创建的目的。在对象生命周期结束时,调用 __del__。让我们更近地观察下这 3 个神奇方法吧:

__new__(cls,[...)

一个对象的实例化时 __new__ 是第一个被调用的方法。在类中传递其他任何参数到 __init__。__new__很少被使用,这样做确实有其目的,特别是当一个子类继承一个不可改变的类型(一个元组或一个字符串)时。我不打算再继续深入追求 __new__ 的细节了,因为这不会产生多大用处,因为在 Python Docs 内已经涵盖了一份巨详细的说明了。

__init__(self,[...)

类的初始化。它会获得初始构建调用传过来的任何东西(举例来说就是,当我们调用x=SomeClass(10,'foo'),__init__ 就会把传过来的 10 和 'foo' 作为参数。__init__在 Python 的类定义中几乎普遍被使用)

__del__(self)

如果 __new__和 __init__ 是对象的构造器,那么 __del__ 就是析构器。它不实现声明为del x(这样的代码不会解释成 x.__del__())的行为。相反,它定义为当一个对象被垃圾回收时的行为。这可能对可能需要额外清理的对象相当有用,比如 sockets 或文件对象。但要小心,如果对象仍处于存活状态而当被解释退出时,__del__ 没有保证就会被执行,因此这样的__del__ 不能作为良好的编码规范的替代。(就像当你完成操作总是要关闭一次连接。但事实上,__del__ 几乎永远不会执行,就因为它处于不安全情况被调用了。使用时保持警惕!)

把上述这些内容合在一起,就成了一份 __init__ 和 __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

延伸阅读

评论