2011-10-11 12 views
17

क्या आप पाइथन (एक ही मॉड्यूल के भीतर) में किसी सदस्य फ़ंक्शन का संदर्भ देते समय self का उपयोग करना चाहते हैं?जब आप पाइथन में 'self' का उपयोग करते हैं?

अधिक आम तौर पर, मैं सोच रहा था कि self का उपयोग करने के लिए केवल विधियों के लिए नहीं बल्कि चर के लिए भी उपयोग करना आवश्यक है।

उत्तर

20

क्योंकि Oskarbi की स्पष्ट नहीं है एक जवाब जोड़ना।

आप self उपयोग करते हैं:

  1. एक उदाहरण विधि को परिभाषित करना। जब आप किसी उदाहरण पर विधि को कॉल करते हैं तो यह स्वचालित रूप से पहले पैरामीटर के रूप में पारित हो जाता है, और यह वह उदाहरण है जिस पर विधि को बुलाया गया था।
  2. एक उदाहरण विधि के अंदर कक्षा या उदाहरण विशेषता का संदर्भ देना। इसका उपयोग करें कि आप उस विधि के अंदर से विधि को कॉल करने के तरीके पर एक विधि को कॉल करना चाहते हैं या नाम (चर) तक पहुंच सकते हैं।

आप जब

  1. आप एक उदाहरण विधि सामान्य रूप से फोन नहीं उपयोग self कर । ओस्करबी के उदाहरण का उपयोग करते हुए, यदि आप instance = MyClass() करते हैं, तो आप MyClass.my_method को instance.my_method(some_var) पर instance.my_method(self, some_var) के रूप में नहीं कहते हैं।
  2. आप से के बाहर एक क्लास एडिशन का संदर्भ देते हैं, उदाहरण के लिए क्लास परिभाषा के अंदर।
  3. आप staticmethod के अंदर हैं।

ये डॉन केवल उदाहरण का उदाहरण नहीं हैं जब स्वयं का उपयोग न करें। डॉस तब होते हैं जब आप इसका उपयोग करते हैं।

1

उदाहरण के लिए चर और विधियों के लिए किसी भी समय स्वयं का उपयोग करना अनिवार्य है।

+0

तो जब संदेह में, हमेशा के पास उसके साथ? –

+0

हां! यह अनिवार्य है। – lc2817

+0

@DarkTemplar आप हमेशा उदाहरण का उपयोग करते समय _defining_ एक उदाहरण विधि, या किसी को कॉल करने या किसी आवृत्ति चर के संदर्भ में एक संदर्भ चर का संदर्भ देने पर स्वयं का उपयोग करते हैं - अन्यथा नहीं। मुझे नहीं पता कि वह "किसी भी समय" के साथ क्या इरादा रखता है लेकिन सचमुच लिया जाने वाला यह सच नहीं है। – agf

11

उदाहरण उदाहरणों और अन्य उदाहरण विधियों से विधियों को संदर्भित करने के लिए self का उपयोग करें। उदाहरण विधियों की परिभाषा में पहले पैरामीटर के रूप में self भी डालें।

एक उदाहरण:

class MyClass(object): 

    my_var = None 

    def my_method(self, my_var): 
     self.my_var = my_var 
     self.my_other_method() 

    def my_other_method(self): 
     # do something... 
+0

तो "वर्ग MyClass (ऑब्जेक्ट)" एक निर्माता है? मैं देखता हूं कि 'ऑब्जेक्ट' एक पैरामीटर है लेकिन यह सुनिश्चित नहीं है कि इसका क्या अर्थ है ... –

+0

@ क्लार्क परिभाषा में डार्कटेम्प्लर पैरामीटर्स बेस क्लास हैं (पाइथन 3 में कक्षा के प्रकार को सेट करने के लिए एक कीवर्ड पैरामीटर, 'मेटाक्लास' भी है) – agf

+0

यह एक कन्स्ट्रक्टर नहीं है, लेकिन वर्ग परिभाषा है। जैसा कि @agf कहता है, 'ऑब्जेक्ट' केवल आधार वर्ग है। जब आप कक्षा को तुरंत चालू करते हैं तो आपको किसी पैरामीटर को पास करने की आवश्यकता नहीं होती है (सिवाय इसके कि यदि आपने अधिक पैरामीटर के साथ '__init __ (स्वयं) विधि निर्दिष्ट की है)। – Oskarbi

3
  1. कुछ भी नहीं नाम self के बारे में 'विशेष' नहीं है। यह पाइथोनिस्टस द्वारा सम्मेलन द्वारा पसंदीदा नाम है, यह इंगित करने के लिए कि उस पैरामीटर में क्या होने की उम्मीद है।

  2. जब आप जानबूझकर इसके लिए प्रदान करते हैं या नहीं, तो पाइथन रनटाइम एक 'स्वयं' मान पास करेगा, चाहे आप इसे प्रदान करते हैं या नहीं। इसका आमतौर पर आसानी से निदान/समझ में त्रुटि होगी (क्योंकि फ़ंक्शन को पैरामीटर की गलत संख्या के साथ बुलाया जाएगा), लेकिन *args का उपयोग अधिक अजीब प्रकार की त्रुटियों का कारण बन सकता है।

  3. पैरामीटर को निश्चित रूप से पारित किया जाता है जब आप किसी उदाहरण पर इंस्टेंस विधि कहते हैं। इसमें वह उदाहरण शामिल है जिस पर आप विधि को कॉल करते हैं।इसलिए आप फंक्शन कॉल में self का उल्लेख नहीं करते हैं क्योंकि (ए) जैसा ऊपर बताया गया है, इससे कोई अर्थ नहीं होगा (सामान्य रूप से self नहीं है, और self कोई कीवर्ड या विशेष नाम या कुछ भी नहीं है); (बी) आपने पहले ही उदाहरण का उपयोग करने के लिए संकेत दिया है (my_instance. लिखकर)।

  4. आप निश्चित रूप से कक्षा से इसे एक्सेस करके एक उदाहरण विधि को स्पष्ट रूप से कॉल कर सकते हैं। इस मामले में, आपको उदाहरण को पहले पैरामीटर के रूप में स्पष्ट रूप से पास करने की आवश्यकता होगी। आप आम तौर पर यह नहीं करना चाहते हैं। और आप विशेष रूप से कोड लिखना नहीं चाहते हैं जो इस संभावना को मानता है कि पहला पैरामीटर कुछ और है जिसे स्पष्ट रूप से इस तरह से पारित किया गया है। यह C++ में if (this == null) की जांच करने जैसा है: आप ऐसा नहीं करते हैं, क्योंकि यदि संभवतः कुछ भी हो सकता है, तो कॉलिंग कोड गलत है, नैतिक रूप से कानूनी रूप से नहीं। (कम से कम पायथन में आपको अपरिभाषित व्यवहार में कोई समस्या नहीं होगी, लेकिन यह अभी भी नैतिक रूप से गलत है।)

  5. उदाहरण विधि के भीतर, self एक पैरामीटर है जिसे उदाहरण के रूप में आवंटित किया गया है, आप लिख सकते हैं उदाहरण के गुणों तक पहुंचने के लिए self.whatever। कुछ अन्य 'अंतर्निहित this' शैली भाषाओं के विपरीत, विशेषता नाम स्पष्ट रूप से "दायरे में" नहीं हैं।

  6. self के लिए कोई अन्य उपयोग के मामले नहीं हैं, फिर से यह एक विशेष नाम नहीं है, और यह नामकरण सम्मेलन के पते का एक विशिष्ट उद्देश्य है। यदि आपको किसी अन्य मॉड्यूल से 'चर' (वास्तव में एक विशेषता) तक पहुंचने की आवश्यकता है, तो आप मॉड्यूल नाम का उपयोग करेंगे। यदि आप मौजूदा मॉड्यूल से किसी तक पहुंचना चाहते हैं, तो उस मामले के लिए कोई उपसर्ग की आवश्यकता नहीं है, या वास्तव में संभव है। (ठीक है, आप स्पष्ट रूप से यह dictglobals() द्वारा लौटाए में लग सकता है, लेकिन ऐसा नहीं करें।)

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