在Python中覆盖__new__和__init__

时间:2010-08-27 12:22:26

标签: python

  

可能重复:
  Python's use of __new__ and __init__ ?

我理解它的方式,__init__与Java中的构造函数不同,因为__init__仅初始化已隐式构造的对象(因为__init__在{{__new__之后被调用1}})。但是,我曾经需要定义的所有东西都使用了Java中“构造函数”的后一个属性。程序员想要覆盖__new__

的情况会怎样?

编辑:对于记录,我问的部分原因是因为我想知道覆盖与使用单独的类方法相比有什么优势/劣势?回答这个问题:

Moving Beyond Factories in Python

2 个答案:

答案 0 :(得分:11)

__new__实际上在对象存在之前发生。这是该类型的静态方法。 __new__的使用是您想要控制新对象的创建,例如单身人士如果__new__总是返回对象的同一个实例,那么它就是一个单例。你不能用__init__

来做到这一点

一般来说,在“像Guido意图那样的python”中,你不应该每月多次使用__new__:)

答案 1 :(得分:3)

__new__用于创建新对象实例,__init__用于初始化它。

我认为如果您设计了一个不可变类型,则必须在__new__中对其进行初始化,例如namedtuple(另请Python's use of __new__ and __init__?)。