Python学习笔记——刻意练习17天(day 11)
魔法方法
简介
魔法方法在面向对象的Python的处处皆是。它们是一些可以让你对类添加“魔法”的特殊方法。 它们经常是两个下划线包围来命名的(比如 init , lt )。但是现在没有很好的文档来解释它们。 所有的魔法方法都会在Python的官方文档中找到,但是它们组织松散。而且很少会有示例(有的是无聊的语法描述, 语言参考)。
构造方法
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 并不会 执行。 所以养成一个手工清理的好习惯是很重要的,比如及时关闭连接。
操作符
使用Python魔法方法的一个巨大优势就是可以构建一个拥有Python内置类型行为的对象。这意味着你可以避免使用非标准的、丑陋的方式来表达简单的操作。 在一些语言中,这样做很常见:
ifinstance.equals(other_instance):# do something
你当然可以在Python也这么做,但是这样做让代码变得冗长而混乱。不同的类库可能对同一种比较操作采用不同的方法名称,这让使用者需要做很多没有必要的工作。运用魔法方法的魔力,我们可以定义方法 eq
ifinstance==other_instance:# do something