2013-04-10 6 views
6

sympy内のすべてのオブジェクトがBasicクラスのサブクラスであり、そしてそれらはすべて__init__なし__new__を使用し、主にそれがsympyが `__init__`の代わりに` __new__`をオーバーライドするのはなぜですか?

def __new__(cls, some, parameter, **others): 
    obj = parentclass.__new__(cls, **others) 
    obj.some = some 
    obj.parameter = parameter 
    return obj 

def __init__(self, some, parameter, **others): 
    parentclass.__init__(self, **others) # or super().__init__(...) 
    self.some = some 
    self.parameter = parameter 

よう__init__を使用しての違いは何ですか?のようなものですか

+2

私は彼らがすべて不変であると思われると思いますか? –

+0

@MartijnPieters - 私は彼らがすでに行われている作業をやり直すのを避けるためにハッシュ可能である必要があると信じています。 – mgilson

+0

それは歴史的な事故かもしれません。古いバージョン(0.5.xなど)は、それが正当化された可能性があるかなり複雑な構造を持っています。 – ecatmur

答えて

2

Numberをご覧ください。彼らは、オブジェクトのクラスが柔軟であることを望んでいます。 Number(...) => Int/Float/...は、__init__では達成できません。

さらに__init____new__の引数になるだろうが、あなたは、元の引数を必要とするmatexpr.pyを参照するか、またはあなたが__new__は、すでに(例えば、for __reduce__のために)何をしたかに適合させるためにそれらを必要はありません。

ほとんどのオブジェクトは独自の__slots__を定義しているため、割り当て可能な固定属性があります。代入は__new____init__で行うことができます。私はそれらを設定し、他の操作をしないで新しい__init__を開く必要はないと思っています - Martijn Pietersとuser4815162342 [source]が指摘しているように、オブジェクトは不変です。あなたがクラスを変更した場合、時には__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> 

が私を修正してください。私はこの答えは完全ではないと思いますが、これらは、私は2つのdownvotesが回答を削除するのを待っマルタインピータースで述べたように、オブジェクトは不変でなければならないことにしてuser4815162342 [source]

さらに__init__を使用しないようにやる気に価値が見つかっ合併症です。

+1

+1 - あなたの以前の答えはちょっと...わかりにくいですが、これは意味があります –

関連する問題