2013-04-10 16 views
6

sympy her nesne Basic sınıfının bir alt sınıfı olan ve hepsi __init__ olmadan __new__ kullanın ve çoğunluklaNeden sympy `__init__` yerine __new__` yi geçersiz kılar?

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

gibi __init__ kullanmanın Ne fark

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

gibi bir şey?

+2

Sanırım hepsi değişmez olmalıydılar? –

+0

@MartijnPieters - Daha önce a.la anma çalışmaları yapılmış olan işleri yeniden yapmaktan kaçınmak için bunların yıkanabilir olması gerektiğine inanıyorum. – mgilson

+0

Sadece tarihi bir kaza olabilir; Daha eski versiyonlar (ör. 0.5.x), belki de haklı görüldüğü önemli ölçüde daha karmaşık bir yapıya sahiptir. – ecatmur

cevap

2

Number'a bakın. Nesnenin sınıfının esnek olmasını istiyorlar. __init__ tarafından sağlanamayan Number(...) => Int/Float/....

Dahası __init__ __new__ savlarını alacağı ancak, orijinal argümanlara ihtiyaç matexpr.py bakın veya bunları __new__ zaten (örneğin for __reduce__ için) yaptıklarından adapte edilmesi gerekmez.

Nesnelerin çoğu kendi __slots__'u tanımlar, böylece onlara atanabilecek sabit öznitelikler vardır. Atama, __new__ ve __init__'da yapılabilir. Ben sadece yeni bir __init__ açmak ve başka bir işlem yapmak için açmaya gerek görmüyorum - Martijn Pieters ve user4815162342 [source] işaret nesneler değişmez. Sınıfa değiştirmek Bazen __init__ değil, bir veya iki kez denir

: hatam varsa

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> 

beni düzeltin. Bu cevap tamamlandığında sanmıyorum ama bunlar Martijn Pieters'e bahsettiği ve 2 downvotes cevabı silmek için user4815162342 [source]

Waiting olarak nesneleri değişmez olması gerektiğini ilave olarak __init__ kullanmamayı motive değer bulundu komplikasyonlardır.

+1

+1 - Önceki cevaplarınız biraz ... şifreli ... ama bu mantıklı. –

İlgili konular