2010-06-25 20 views
12

मैं निम्नलिखित वर्ग है:अजगर, अपरिवर्तनीय उपवर्गीकरण प्रकार

class MySet(set): 

    def __init__(self, arg=None): 
     if isinstance(arg, basestring): 
      arg = arg.split() 
     set.__init__(self, arg) 

यह काम करता है के रूप में उम्मीद (पत्र से स्ट्रिंग के शब्दों के साथ सेट initialising बल्कि)। लेकिन जब मैं क्या करना चाहते हैं सेट के अपरिवर्तनीय संस्करण के साथ एक ही है, __init__ विधि पर ध्यान नहीं दिया जा रहा है:

class MySet(frozenset): 

    def __init__(self, arg=None): 
     if isinstance(arg, basestring): 
      arg = arg.split() 
     frozenset.__init__(self, arg) 

मैं __new__ के साथ इसी तरह कुछ हासिल कर सकते हैं?

+1

मैं कारण यह है कि '__new __ (..)' पहल लेता है लगता है कि जब यह बात आती है अपरिवर्तनीय प्रकार के उदाहरणों को मूर्तिकला देने के लिए अपरिवर्तनीयता का लाभ उठाना और उपलब्ध होने पर मौजूदा उदाहरण वापस करने का अवसर सुरक्षित रखना है। (लेकिन अगर कोई उस लाभ को नहीं चाहता है, तो वे '__new __ (..) 'के साथ गड़बड़ किए बिना एक अपरिवर्तनीय प्रकार बना सकते हैं। विशेष रूप से,' __new __ (..)' कोई विशेष संदर्भ नहीं देता है। एक अभी भी 'ऑब्जेक्ट .__ setattr __ (..)' या इसी तरह के माध्यम से अपरिवर्तनीय फ़ील्ड को संशोधित करना है, चाहे वह '__new __ (..)' या '__init _ (..)' के भीतर है। –

उत्तर

12

हाँ, आप __new__ विशेष विधि ओवरराइड करने के लिए की जरूरत है:

class MySet(frozenset): 

    def __new__(cls, *args): 
     if args and isinstance (args[0], basestring): 
      args = (args[0].split(),) + args[1:] 
     return super (MySet, cls).__new__(cls, *args) 

print MySet ('foo bar baz') 

और उत्पादन होता है:

MySet(['baz', 'foo', 'bar']) 
+0

सुपर! __init__ को बहिष्कृत किया जा सकता है? – EoghanM

+4

@EoghanM: नहीं, '__new__' अलग है। असल में, '__new__' बनाता है * या * एक उदाहरण लुकअप करता है, जबकि' __init__' पहले से बनाए गए उदाहरण को सेटअप करता है। '__new__' को ओवरराइड करने के मुख्य कारण नए उदाहरण निर्माण से बचने के लिए है (उदाहरण के लिए 'कुछ टाइप()' हमेशा एक ही सिंगलटन ऑब्जेक्ट को वापस करने के लिए), या 'फ्रोजनसेट' जैसे कुछ अपरिवर्तनीय प्रकारों को उप-वर्गीकृत करने के लिए। विवरण के लिए http://docs.python.org/reference/datamodel.html#special-method- नाम देखें। – doublep

+0

thx - मेरा उप प्रश्न यहां अधिक स्पष्ट रूप से सामने आया: http://stackoverflow.com/questions/3131488/ – EoghanM

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