2009-10-19 8 views
5

मेरे पास पाइथन 2.6 के साथ एक मूल मोनोस्टेट है।मोनोस्टेट के साथ पाइथन बहिष्करण चेतावनी __new__ - क्या कोई समझा सकता है क्यों?

class Borg(object): 
    __shared_state = {} 
    def __new__(cls, *args, **kwargs): 
     self = object.__new__(cls, *args, **kwargs) 
     self.__dict__ = cls.__shared_state 
     return self 

    def __init__(self, *args, **kwargs): 
     noSend = kwargs.get("noSend", False) 
     reportLevel = kwargs.get("reportLevel", 30) 
     reportMethods = kwargs.get("reportMethods", "BaseReport") 
     contacts= kwargs.get("contacts", None) 

a = Borg(contacts="Foo", noSend="Bar",) 

कौन सा खुशी से मेरा पीछा अस्वीकार्यता चेतावनी देता है ..

untitled:4: DeprecationWarning: object.__new__() takes no parameters 
    self = object.__new__(cls, *args, **kwargs) 

के बाद मैं इस खोजने के googling के एक बिट Bug #1683368 से जुड़ा हुआ है। जो मैं समझ नहीं सकता वह इसका क्या अर्थ है। यह निम्नलिखित पंक्ति

self = object.__new__(cls, *args, **kwargs) 

के बारे में शिकायत कर रहा है जो ठीक प्रतीत होता है। क्या कोई लेमेन शर्तों में समझा सकता है कि यह एक समस्या क्यों है। मैं समझता हूं कि "यह अन्य अंतर्निर्मित, सूची की तरह असंगत है" लेकिन मुझे यकीन नहीं है कि मैं क्यों समझता हूं। क्या कोई मुझे यह दिखाने का सही तरीका बताएगा?

धन्यवाद

उत्तर

1

चेतावनी तथ्य से आता है कि __new__() आर्ग हो सकता है, लेकिन जब से वे हर जगह पर ध्यान नहीं दिया रहे हैं, आर्ग (सीएलएस के अलावा अन्य) पारित करने के लिए यह चेतावनी का कारण बनता है। यह वास्तव में (वर्तमान में) अतिरिक्त तर्क पारित करने में त्रुटि नहीं है, लेकिन उनका कोई प्रभाव नहीं है।

py3k में यह तर्क पारित करने में एक त्रुटि बन जाएगा।

+0

मैं देखना है कि वे कैसे नजरअंदाज कर दिया जाता नाकाम रहने रहा हूँ? नए से * args और ** kwargs निकालें और यह बम होगा क्योंकि उन्हें __init__ की आवश्यकता है जो उन्हें उम्मीद कर रहा है। आपका अंतिम विवरण वह है जिसे मैं रोकने की कोशिश कर रहा हूं :-) मैं इसे 3k में काम करना चाहता हूं। – rh0dium

+0

मैं भाषा डिजाइनरों के साथ बहस नहीं कर सकता। अगर वे कहते हैं कि "नया कोई तर्क नहीं लेता है", तो मैं इसे कोई तर्क नहीं देता हूं। '__init__' और' __new__' फ़ंक्शन समान रूप से, शायद आपके उपयोग के मामले को नए के बजाय init का उपयोग करना चाहिए। –

6

python-singleton-object-instantiation देखें, और ध्यान दें Alex Martelli's सिंगलटन उदाहरण:

class Singleton(object): 

    __instance = None 

    def __new__(cls): 
     if cls.__instance == None: 
      __instance = type.__new__(cls) 
      __instance.name = "The one" 
     return __instance 

__new__ deprecation सवाल answered by Guido था:

संदेश का अर्थ यह सिर्फ क्या कहते हैं। :-) ऑब्जेक्ट को कॉल करने में कोई बात नहीं है .__ क्लास पैरामीटर से अधिक के साथ नया __(), और पर कोई भी कोड ऐसा किया गया था जो कि उन तर्कों को ब्लैक होल में डंप कर रहा था।

केवल समय जब यह वस्तु के लिए .__ नई __ समझ में आता है() अतिरिक्त तर्कों की अनदेखी करने के जब यह ओवरराइड नहीं किया जा रहा है है, लेकिन __init__ किया जा रहा अधिरोहित है - तो आप एक पूरी तरह से डिफ़ॉल्ट __new__ और जाँच की है कन्स्ट्रक्टर तर्कों का __init__ पर रवाना किया गया है।

इसका उद्देश्य ऑब्जेक्ट (42) जैसे कॉल में त्रुटि को पकड़ना है जो (दोबारा) एक तर्क को पास करता है जिसका उपयोग नहीं किया जाता है। यह अक्सर आपके प्रोग्राम में एक बग का एक लक्षण है।

--Guido

+0

यह एक सिंगलटन (उर्फ हाइलैंडर) एक बोर्ग (मोनोस्टेट) नहीं है। मैं पहले से ही [स्कूली] [1] रहा हूं।मैंने गिडो की टिप्पणियों को भी तैयार किया है, लेकिन जैसा कि मैंने पहले कहा था कि अगर आपके init में * args ** kwargs की आवश्यकता है तो __new__ को भी उनकी आवश्यकता होगी? सही?? [1]: http://stackoverflow.com/questions/1575680/ensure-that-only-one-instance-of-a-class-gets-run – rh0dium

+0

क्षमा करें बोल्ड और लिंक गड़बड़ हो गया .. – rh0dium

+0

Guido स्पष्ट रूप से कहता है कि कन्स्ट्रक्टर तर्कों की जांच करने के लिए केवल __init__ की आवश्यकता है। – gimel

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