Python魔术方法详解

1159次阅读  |  发布于5年以前

介绍

此教程为我的数篇文章中的一个重点。主题是魔术方法。 什么是魔术方法?他们是面向对象的Python的一切。他们是可以给你的类增加"magic"的特殊方法。他们总是被双下划线所包围(e.g. init 或者 lt)。然而他们的文档却远没有提供应该有的内容。Python中所有的魔术方法均在Python官方文档中有相应描述,但是对于他们的描述比较混乱而且组织比较松散。很难找到有一个例子(也许他们原本打算的很好,在开始语言参考中有描述很详细,然而随之而来的确是枯燥的语法描述等等)。

所以,为了修补我认为Python文档应该修补的瑕疵,我决定给Python中的魔术方法提供一些用平淡的语言和实例驱使的文档。我在开始已经写了数篇博文,现在在这篇文章中对他们进行总结。

我希望你能够喜欢这篇文章。你可以将之当做一个教程,一个补习资料,或者一个参考。本文章的目的仅仅是为Python中的魔术方法提供一个友好的教程。

构造和初始化

每个人都知道一个最基本的魔术方法, init 。通过此方法我们可以定义一个对象的初始操作。然而,当我调用 x = SomeClass() 的时候, init 并不是第一个被调用的方法。实际上,还有一个叫做 new 的方法,来构造这个实例。然后给在开始创建时候的初始化函数来传递参数。在对象生命周期的另一端,也有一个 del 方法。我们现在来近距离的看一看这三个方法:

new(cls, [...) new 是在一个对象实例化的时候所调用的第一个方法。它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法。 new 方法相当不常用,但是它有自己的特性,特别是当继承一个不可变的类型比如一个tuple或者string。我不希望在 new 上有太多细节,因为并不是很有用处,但是在 Python文档 http://www.python.org/download/releases/2.2/descrintro/#__new__ 中有详细的阐述。

init(self, […) 此方法为类的初始化方法。当构造函数被调用的时候的任何参数都将会传给它。(比如如果我们调用 x = SomeClass(10, 'foo')),那么 init 将会得到两个参数10和foo。 init 在Python的类定义中被广泛用到。

del(self) 如果 newinit 是对象的构造器的话,那么 del 就是析构器。它不实现语句 del x (所以代码将不会翻译为 x.del() )。它定义的是当一个对象进行垃圾回收时候的行为。当一个对象在删除的时候需要更多的清洁工作的时候此方法会很有用,比如套接字对象或者是文件对象。注意,因为当解释器退出的时候如果对象还存在,不能保证 del 能够被执行,所以 del can't serve as a replacement for good coding practices ()~~~

放在一起的话,这里是一个 initdel 实际使用的例子。

复制代码 代码如下:

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  

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8