आपको "स्वयं" की आवश्यकता क्यों है उदाहरण चर का संदर्भ देने के लिए पायथन में?


13

मैं जावा, रूबी, हास्केल और पायथन जैसी कई भाषाओं में प्रोग्रामिंग कर रहा हूं। मुझे जिन परियोजनाओं पर काम करना है, उनके कारण मुझे प्रतिदिन कई भाषाओं के बीच स्विच करना पड़ता है। अब, मुद्दा यह है कि मैं अक्सर selfपायथन में फ़ंक्शन परिभाषाओं में पहले पैरामीटर के रूप में लिखना भूल जाता हूं, उसी ऑब्जेक्ट पर कॉलिंग विधियों के साथ है।

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

मेरा प्रश्न यह क्यों selfआवश्यक है? क्या यह विशुद्ध रूप से एक स्टाइल चॉइस है, या ऐसा कोई कारण है कि पायथन आपको selfजावा और सी ++ को जिस तरह से छोड़ देता है उसे आप छोड़ नहीं सकते this?



1
@gnat अब केवल मुकदमा करता है, और गंभीरता से एक अच्छा सवाल है जो मुझे कुछ दिनों से परेशान कर रहा है, कृपया इसे वोटिंग द्वारा मत मारो।
विवेक

2
इस सवाल को stackoverflow.com/questions/2709821/… द्वारा अच्छी तरह से कवर किया गया है ।
डेविड अरनो

मेरी समझ यह है कि यह पहली दलील के रूप में एक पॉइंटर से किसी स्ट्रक्चर को पास करने की सी-शैली पर आधारित है।
दान्नो

@staticmethodविधि घोषणा से पहले लिखना , त्रुटि को दबा देता है (बस जानकारी के लिए और यह भी अनुशंसित नहीं है)
यश

जवाबों:


23

1) selfविधि हस्ताक्षर में एक स्पष्ट पैरामीटर के रूप में क्यों आवश्यक है?

क्योंकि विधियाँ कार्य करती हैं और foo.bar(baz)इसके लिए सिंटैक्टिक शुगर है bar(foo, baz)। कक्षाएं केवल शब्दकोश हैं जहां कुछ मूल्य कार्य हैं। (कंस्ट्रक्टर भी केवल कार्य हैं, यही कारण है कि पायथन की आवश्यकता नहीं है new) आप कह सकते हैं कि पायथन यह स्पष्ट करता है कि ऑब्जेक्ट सरल घटकों से निर्मित हैं। यह "स्पष्ट रूप से निहित की तुलना में बेहतर है" के अनुसार है -विद्या।

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

जावास्क्रिप्ट एक ऐसी भाषा का उदाहरण है this, जिसमें जावा जैसा निहितार्थ है, लेकिन जहां पायथन जैसी वस्तुओं से अलग-अलग कार्य हो सकते हैं। यह इस बात के बारे में बहुत भ्रम पैदा thisकरता है कि क्या संदर्भित करता है जब कार्यों को पास किया जाता है और विभिन्न संदर्भों में बुलाया जाता है। कई सहज रूप से लगता thisहै कि फ़ंक्शन की कुछ आंतरिक संपत्ति को संदर्भित करना चाहिए, जबकि यह वास्तव में फ़ंक्शन को जिस तरह से कहा जाता है, उसी से पूरी तरह से निर्धारित होता है। मेरा मानना ​​है कि thisपाइथन की तरह एक स्पष्ट पैरामीटर होने के कारण यह बहुत कम भ्रमित करेगा।

स्पष्ट- selfव्यास के कुछ अन्य लाभ :

  • डेकोरेटर सिर्फ ऐसे कार्य हैं जो अन्य कार्यों को लपेटते हैं। चूंकि विधियां सिर्फ कार्य हैं, सज्जाकार ठीक तरीकों पर काम करते हैं। यदि किसी प्रकार का निहितार्थ था, तो सज्जाकार पारदर्शी तरीके से काम नहीं करेंगे।

  • Classmethods और स्थिर विधियाँ एक उदाहरण पैरामीटर नहीं लेते हैं। क्लासमेथोड्स पहले तर्क (आमतौर पर कहा जाता है ) के रूप में एक वर्ग लेते हैं cls। स्पष्ट selfया clsपैरामीटर यह बहुत स्पष्ट करता है कि क्या चल रहा है, और आपके पास विधि में क्या है।

2) इंस्टेंस वेरिएबल्स को हमेशा योग्य क्यों होना चाहिए " self.?

जावा में, आपको " this." के साथ सदस्य चर उपसर्ग करने की आवश्यकता नहीं है , लेकिन पायथन self.में हमेशा " " आवश्यक है। कारण यह है कि पायथन के पास चर घोषित करने के लिए एक स्पष्ट वाक्यविन्यास नहीं है, इसलिए यह बताने का कोई तरीका नहीं होगा कि क्या x = 7एक नया स्थानीय चर घोषित करना है या सदस्य चर को निर्दिष्ट करना है। निर्दिष्ट करना self.इस अस्पष्टता को हल करता है।


अंतर्निहित सदस्य चर संदर्भ (बिना self.जावा की तरह) स्कूपिंग नियमों के साथ मौलिक रूप से असंगत है और जब आपको वहां स्पष्ट होने की आवश्यकता होती है, तो पैरामीटर के बारे में निहित होने से यह सब समझ में नहीं आता है।
जनवरी

@ जानहुडेक: अच्छा, बात। मैंने इसे उत्तर में जोड़ दिया है।
जैक्सबी

6

एक सरल कारण है कि AFAIK को क्रॉस-साइट डुप्लिकेट में वास्तव में नहीं छुआ गया है, न ही यहां: पायथन ने एक प्रक्रियात्मक भाषा के रूप में शुरू किया। यह एबीसी पर आधारित था, एक प्रक्रियात्मक भाषा भी।

ऑब्जेक्ट-ओरिएंटेशन को बाद में जोड़ा गया था, और जब इसे जोड़ा गया था, तो गुइडो वैन रोसुम ने पायथन के डिजाइन को सरल रखने के लिए, कम से कम सुविधाओं को जोड़ना चाहते थे। पायथन में पहले से ही dictएस और फ़ंक्शंस थे, इसलिए भाषा में कुछ नया क्यों जोड़ें, जब कोई वस्तु बस dictस्लॉट्स की हो सकती है और क्लास बस dictफ़ंक्शंस की हो सकती है ? एक विधि को आंशिक रूप से लागू फ़ंक्शन के रूप में व्याख्या की जा सकती है जो एकल प्रतिष्ठित तर्क पर बंद हो जाती है। और ठीक यही तरीका है कि पायथन में कैसे तरीके लागू किए जाते हैं: वे नहीं हैं। वे केवल कार्य हैं जो एक अतिरिक्त प्रतिष्ठित तर्क प्राप्त करते हैं।


मेरा मानना ​​है कि पायथन ने OO को समर्थन दिया और पहले जारी संस्करण से कक्षाएं और विरासत थी। कम से कम यह वही है जो विकिपीडिया मुझे बताता है। लेकिन वैन रॉसम्स प्रक्रिया शुरू में भाषा को डिजाइन करने के रूप में आप का वर्णन किया गया हो सकता है।
जैक्सबी


लिंक के लिए धन्यवाद, यह वास्तव में दिलचस्प पढ़ना है।
जैक्सबी

2

यहाँ उपरोक्त उत्तरों पर आधारित मेरे निष्कर्ष हैं और इस विषय पर गुइडो की अपनी जुबानी पढ़ रहे हैं:

बड़ा विचार है

कार्य पायथन में महत्वपूर्ण बिल्डिंग ब्लॉक हैं (या हमें केवल एक ही कहना चाहिए), वास्तव में हम कार्यों का उपयोग करके ओओपी का अनुकरण करने की तरह हैं।

यह देखते हुए कि एक वर्ग कुछ भी नहीं है, लेकिन कार्यों का एक शब्दकोश इसलिए, हम किसी भी फ़ंक्शन को रन समय पर संलग्न कर सकते हैं। मूल रूप से यह इस वजह से है कि हम रनिंग टाइम पर फंक्शन को टॉस कर सकते हैं । यहां selfपैरामीट्रिक पॉलीमॉर्फिज़्म का समर्थन करने वाला पैरामीटर।


1
स्व-उत्तरित प्रश्नों को प्रोत्साहित किया जाता है जब आपका उत्तर उच्च गुणवत्ता वाला उत्तर हो। जब मैं आपके उत्तर की तुलना यहाँ अन्य उत्तरों से करता हूँ, तो मुझे आश्चर्य होता है कि आपको ऐसा क्यों लगा कि आपको इसे जोड़ने की आवश्यकता है। अन्य उत्तर अधिक गहराई में जाते हैं और आपके उत्तर की तुलना में अधिक विवरण जोड़ते हैं।

1
@ GlenH7 का जवाब सिर्फ मेरे संदर्भ के लिए था क्योंकि हर बार मैं हर किसी के जवाब को बार-बार नहीं आ सकता। गुणवत्ता के बारे में, मुझे बताएं कि क्या कोई भी जानकारी भ्रामक है। वैसे भी मैं आमतौर पर किसी भी उत्तर को स्वीकार करने के लिए 2-3 दिन इंतजार करता हूं।
विवेक

डाउन वोटिंग सस्ती मुद्रा बन रही है और यहां हर कोई इसका अर्थ जाने बिना ही दोनों हाथों से खर्च कर रहा है। क्या आपको एहसास है कि अगर कोई यहाँ आता है तो नीचे दिए गए जवाब को देख कर लगता है कि यह गलत होगा!
विवेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.