2013-04-10 14 views
6

sympy में हर वस्तु Basic वर्ग का एक उपवर्ग है, और वे सभी __init__ बिना __new__ उपयोग करते हैं, और ज्यादातर इसे पसंद`__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 - मेरा मानना ​​है कि उन्हें फिर से काम करने से बचने के लिए हैशबल होने की आवश्यकता है जो पहले से ही a.la memoization किया जा चुका है। – mgilson

+0

यह सिर्फ एक ऐतिहासिक दुर्घटना हो सकती है; पुराने संस्करण (उदा। 0.5.x) में काफी जटिल संरचना है जहां शायद यह उचित था। – ecatmur

उत्तर

2

Number पर एक नज़र डालें। वे वस्तु के वर्ग को लचीला होना चाहते हैं। Number(...) => Int/Float/... जो __init__ द्वारा हासिल नहीं किया जा सकता है।

इसके अलावा __init____new__ के तर्कों मिलेगा लेकिन यदि आप मूल तर्क की जरूरत नहीं है matexpr.py देख सकते हैं या आप की जरूरत उन्हें __new__ क्या पहले से ही किया था (उदाहरण के for __reduce__ के लिए) के लिए अनुकूलित किया जाना है।

अधिकांश ऑब्जेक्ट अपने __slots__ को परिभाषित करता है, इसलिए निश्चित गुण हैं जिन्हें उन्हें असाइन किया जा सकता है। असाइनमेंट __new__ और __init__ में किया जा सकता है। मुझे बस उन्हें सेट करने और कोई अन्य ऑपरेशन करने के लिए एक नया __init__ खोलने की आवश्यकता नहीं दिखाई दे रही है - मार्टिजन पीटर और उपयोगकर्ता 4815162342 [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> 

मुझे सही अगर मैं गलत हूँ। मुझे नहीं लगता कि इस उत्तर के पूरा हो गया है, लेकिन इन जटिलताओं मैं करने के लिए अतिरिक्त __init__ का उपयोग नहीं करने के लिए है कि वस्तुओं अपरिवर्तनीय के रूप में मार्टिन पीटर्स ने उल्लेख किया और 2 downvotes जवाब को नष्ट करने के लिए user4815162342 [source]

प्रतीक्षा की जा रही किया जाना चाहिए प्रेरित करने लायक पाए जाते हैं।

+1

+1 - आपके पिछले उत्तर थोड़ा सा थे ... गूढ़ ... लेकिन यह समझ में आता है –

संबंधित मुद्दे