2010-08-27 9 views
8

संभव डुप्लिकेट:
Python's use of __new__ and __init__ ?अधिभावी __new__ और अजगर में __init__

तरह से मैं इसे समझ, __init__ जावा में एक निर्माता से अलग है, क्योंकि __init__ केवल एक वस्तु है कि initializes पहले से ही अंतर्निहित बनाया गया है (क्योंकि __init__ को __new__ के बाद बुलाया जाता है)। हालांकि, मुझे जो कुछ भी परिभाषित करने की आवश्यकता है, उसने जावा में 'कन्स्ट्रक्टर' की इस बाद की संपत्ति का उपयोग किया है। एक ऐसा मामला क्या होगा जिसमें प्रोग्रामर __new__ को ओवरराइड करना चाहेगा?

संपादित: रिकॉर्ड के लिए, मैं आंशिक रूप से पूछना क्योंकि मैं सोच रहा हूँ क्या लाभ/नुकसान इस सवाल का जवाब स्वीकार किए जाते हैं में एक अलग classmethod का उपयोग कर अधिभावी को नई बनाम होगा:

Moving Beyond Factories in Python

+0

मेरी आंखों में काफी सटीक डुप्लिकेट नहीं – abyx

उत्तर

11

__new__ वास्तव में से पहले एक वस्तु मौजूद होता है। यह प्रकार की एक स्थिर विधि है। __new__ का उपयोग तब होता है जब आप नई वस्तुओं के निर्माण को नियंत्रित करना चाहते हैं, उदा। एक सिंगलटन यदि आपका __new__ हमेशा ऑब्जेक्ट का एक ही उदाहरण देता है, तो यह एक सिंगलटन है। आप __init__ के साथ ऐसा नहीं कर सकते हैं।

आम तौर पर, में "अजगर के रूप में गुइडो यह इरादा" आप एक बार एक महीने से भी __new__ अधिक उपयोग नहीं करना चाहिए :)

+0

यह समझ में आता है। तो क्या यह (नीचे स्वीकृत उत्तर) एक मामला है जहां __new__ ओवरराइडिंग भी उचित होगा? http://stackoverflow.com/questions/3571773/moving-beyond-factories-in-python – chimeracoder

+0

@thebackhand यह कैसा दिखता – abyx

3

__new__, नई वस्तु उदाहरण बनाने के लिए है __init__ यह आरंभ के लिए है।

मुझे लगता है कि अगर आप एक अपरिवर्तनीय प्रकार डिजाइन, आप __new__ में यह प्रारंभ करने में, उदाहरण के लिए namedtuple (भी Python's use of __new__ and __init__?) को देखने के लिए है।

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