看看数字 。他们希望对象的类是灵活的。Number(...) => Int/Float/...
这是无法实现的__init__
。
此外,__init__
将获得的参数,__new__
但您不需要原始参数,请参阅matexpr.py或者您需要它们适应__new__
已经做过的事情(例如for__reduce__
)。
大多数对象定义自己的__slots__
,因此可以分配给它们的固定属性。分配可以在__new__
和中完成__init__
。我认为不需要打开一个新__init__
的来设置它们并且不执行其他操作 - 正如 Martijn Pieters 和 user4815162342 [来源]指出的对象是不可变的。
如果您更改类,有时__init__
会调用不,一次或两次:
class X(object):
def __new__(self): # sorry but self is the class I apologize!
obj = object.__new__(Y)
return obj
def __init__(self):
print 1
>>> class Y(object):
def __init__(self):
print 2
>>> X() # no __init__ call, limiting you to stay in the class hierarchy
<__main__.Y object at 0x7f287e769350>
>>> class Y(X):
def __init__(self):
print 2
>>> X() # one __init__ call
2
<__main__.Y object at 0x7f287e7693d0>
>>> class X(object):
def __new__(self):
obj = Y()
return obj
def __init__(self):
print 1
>>> class Y(X):
def __new__(self):
return object.__new__(self)
def __init__(self):
print 2
>>> X() # __init__ called twice, structure copied from number.py
2
2
<__main__.Y object at 0x7f287e7692d0>
如果我错了,请纠正我。我不认为这个答案是完整的,但这些是我发现值得激励不要使用的复杂性,__init__
除了 Martijn Pieters 和 user4815162342 提到的对象应该是不可变的[来源]
等待 2 票否决以删除答案。