重写__new__和__init__在Python

问题描述:

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

就我的理解,__init__是从Java中的构造不同,因为__init__仅初始化有一个对象已经被隐含地构建(因为__init____new__之后被调用)。但是,我需要定义的所有东西都使用了Java中的“构造函数”的后一个属性。程序员想要重写__new__的情况是什么?

编辑:为了记录在案,我问一方面是因为我不知道会是什么优势/劣势在接受这个问题的答案使用一个单独的类方法来覆盖对比:

Moving Beyond Factories in Python

+0

在我眼中不完全相同 – abyx 2010-08-27 12:50:53

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

一般来说,在“Python作为圭多预期它是”你不应该使用__new__超过每月一次:)

+0

这很有道理。那么这个(接受的答案在下面)一个重写__new__也适合的情况? http://stackoverflow.com/questions/3571773/moving-beyond-factories-in-python – chimeracoder 2010-08-27 12:28:59

+0

@thebackhand看起来像它 – abyx 2010-08-27 12:51:09

__new__是创建新的对象实例,__init__是对其进行初始化。

我想如果你设计一个不可变的类型,你必须在__new__中初始化它,例如参见namedtuple(也是Python's use of __new__ and __init__?)。