Numberを見てください 。彼らは、オブジェクトのクラスが柔軟であることを望んでいます。Number(...) => Int/Float/...
では達成できません__init__
。
さらに、__init__
は の引数を取得します__new__
が、元の引数は必要ありません。matexpr.pyを参照するか、既に実行したものに適合させる必要があります__new__
(たとえば)。__reduce__
ほとんどのオブジェクトは独自に定義するため、オブジェクト__slots__
に割り当てることができる固定属性があります。__new__
代入はとで行うことができます__init__
。それらを設定するだけで他の操作を行わないために新しいものを開く必要はないと思います__init__
-Martijn Pietersとuser4815162342 [source]が指摘したように、オブジェクトは不変です。
__init__
クラスを変更すると、1 回または 2 回呼び出されないことがあります。
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つの反対票を待っています。