本文翻译自 《The Inside Story on New-Style Classes》
Notice:1. 专有名词为避免歧义会保留原文。2. 关键内容译者会在原文基础上加上自己的理解。

表面上,新式类(new-style classes)和传统类(origin class)在实现上看起来非常像。然而,新式类却涵盖了一些新概念:

下面几部分,将分别介绍这些概念。

1. Low-level constructors and __new__()

传统意义上讲,类中定义的 __init__ 方法决定了类在创建之后如何初始化。但在有些场景里,类的作者希望自定义实例的创建过程。例如,假设一个对象从持久化数据库(persistant database)中恢复,旧式类(old-style)不会提供定制创建对象的方法(hook),不过有一些模块却允许通过非标准的方式创建类(如,new模块)。

新式类拥有创建类的方法__new__,可以让类的作者定制如何创建类的实例对象。通过重写 __new__(),类作者可以实现类如单例模式的设计模式,返回一个之前已经创建的类实例,或者返回一个不同的类。然而__new__却有其它重要用途。例如,在pickle模块中,__new__被用来创建一个未实例化的对象。这个案例中,虽然实例被创建,但 __init__ 方法并未被调用。

__new__ 的另一个用途是帮助改进不可变类型的子类。根据其不变性的性质,这些类型的对象无法通过标准的__init __方法进行初始化。相反,任何特殊初始化方法必须和该对象创建时的行为保持一致;例如,如果类想要修改存储在不可变对象中的值,则__new__方法可以通过将修改后的值传递给基类__new__方法来完成。

未完待续…