2013-09-22 10 views
7

मैं यह पता लगाने की कोशिश कर रहा हूं कि मैं object() अंतर्निहित फ़ंक्शन का उपयोग कैसे करूंगा। इसमें कोई तर्क नहीं होता है, और उस प्रकार की "फीचरलेस ऑब्जेक्ट" देता है जो सभी पायथन कक्षाओं के लिए आम है, और इसमें सभी विधियां हैं जो सभी पायथन कक्षाओं के लिए आम हैं।ऑब्जेक्ट() अंतर्निहित उपयोगी कब है?

WHAT. IS. THIS?

+0

यह किसी फ़ंक्शन के रूप में उपयोग करने का इरादा नहीं है; इसका उद्देश्य आधार वर्ग का उपयोग करना है। – refi64

+0

पायथन 3 में? क्यूं कर? मैं उससे क्या हासिल करूंगा? कक्षाएं स्वचालित रूप से उन तरीकों का वारिस करती हैं, नहीं? – Aerovistae

+3

मुझे लगता है कि आपके द्वारा दिए गए दस्तावेज़ लिंक में उल्लसित कैसे है, इसमें कुछ हाइपरलिंक्ड टेक्स्ट है जो पुनरावर्ती रूप से स्वयं को इंगित करता है। – Shashank

उत्तर

11

जैक Skellington के शब्दों में, यहां तक ​​कि अगर आप इसके साथ कार्यक्रम की जरूरत नहीं है, object एक उद्देश्य में कार्य करता है: यह सामान्य वर्ग से दूर अन्य सभी वस्तुओं प्राप्त कर रहे हैं है। यह mro (method resolution order) विधि द्वारा सूचीबद्ध अंतिम श्रेणी है। हमें इस अवधारणा के लिए एक नाम और वस्तु की आवश्यकता है, और object इस उद्देश्य को पूरा करता है।

object के लिए एक और उपयोग sentinels बनाने के लिए है।

sentinel = object() 

इस बार बहु ​​प्रोग्रामिंग में प्रयोग किया जाता है - signal a termination event के लिए - कतारों के माध्यम से पारित कर दिया। हम None या किसी अन्य मूल्य को नहीं भेजना चाहते हैं क्योंकि कतार हैंडलर को उन मानों की व्याख्या करने की आवश्यकता हो सकती है, जिन्हें संसाधित करने के तर्क हैं। हमें कुछ अद्वितीय मूल्य की आवश्यकता है कि कार्यक्रम का कोई अन्य हिस्सा उत्पन्न नहीं हो सकता है।

इस तरह एक सेंटीनेल बनाना इस तरह की एक अनूठी वस्तु प्रदान करता है जो निश्चित रूप से एक सामान्य कतार मान नहीं है, और इस प्रकार किसी विशेष घटना के लिए सिग्नल के रूप में परीक्षण और उपयोग किया जा सकता है। अन्य संभावनाएं हैं, जैसे क्लास, या क्लास इंस्टेंस या फ़ंक्शन बनाना, लेकिन ये सभी विकल्प बड़े, अधिक संसाधन भारी हैं, और object() के रूप में पिथी नहीं हैं।

4

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

class SomeClass(object): 
    def __setattr__(self, name, value): 
     if name not in ('attr1', 'attr2', 'attr3', 'attr4'): 
      object.__setattr__(self, name, value) 
     else: 
      do_something_else() 
+1

स्टैक एक्सचेंज में आपका स्वागत है! यहां आपकी [कार्निवल इवेंट गाइड] है (http://stackexchange.com/sites) – Aerovistae

+0

मैं आमतौर पर 'सुपर()' का उपयोग करने के पक्ष में सीधे 'ऑब्जेक्ट' पर कॉलिंग विधियों से बचने के लिए कहूंगा। एक कारण यह है कि यह सहकारी एकाधिक विरासत की अनुमति देता है। 'ऑब्जेक्ट 'कक्षा अभी भी निश्चित रूप से शामिल होगी, क्योंकि यह अंतिम आधार वर्ग है कि' सुपर() 'कॉल अंततः पहुंच जाएगी, लेकिन आपको इसे स्पष्ट रूप से नाम देने की आवश्यकता नहीं है। – Blckknght

+0

@Blckknght मैं आम तौर पर उस पर आपसे सहमत हूं, हालांकि, तोड़ने के मामले में, मैं आमतौर पर एक सुपर-क्लास के कारण रिकर्सन तोड़ने की कोशिश कर रहा हूं (ढांचे के साथ काम नहीं कर रहा है?)। यह एक प्रयोग का मामला है जहां मैं (सामान्य रूप से) स्पष्ट रूप से वस्तु का उपयोग करता हूं। – Tritium21

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