Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन NameError: name 'self' is not defined समाधान

मान "self" केवल एक मेथड के अंदर उपलब्ध होता है जब एक फ़ंक्शन को कॉल किया जाता है और निर्दिष्ट किया जाता है।

आप "self" को मेथड में निर्दिष्ट आर्गुमेंट्स में एक्सेस नहीं कर सकते, या "self" को आर्गुमेंट के रूप में निर्दिष्ट किए बिना फ़ंक्शन के अंदर एक्सेस नहीं कर सकते। अन्यथा, आपको त्रुटि "NameError: name 'self' is not defined" दिखाई देती है।

इस गाइड में, हम बात करते हैं कि इस त्रुटि का क्या अर्थ है और यह क्यों उठाई जाती है। हम कुछ कोड स्निपेट्स के माध्यम से चलते हैं ताकि आप यह पता लगा सकें कि अपने कोड में इस त्रुटि को कैसे हल किया जाए।

NameError: name 'self' is not defined

"self" वेरिएबल एक क्लास के अंदर एक ऑब्जेक्ट के बारे में जानकारी रखता है। ऑब्जेक्ट को असाइन किए गए सभी मान "self" वेरिएबल में उपलब्ध हैं।

"self" को आर्गुमेंट के रूप में पास किया जाना चाहिए यदि आप इसे मेथड में उपयोग करना चाहते हैं। "self" वेरिएबल को मेथड में अन्य आर्गुमेंट्स में उपयोग नहीं किया जा सकता क्योंकि यह केवल मेथड के भीतर से एक्सेसिबल है।

आप "NameError: name 'self' is not defined" त्रुटि का सामना करते हैं यदि आप:

  • "self" को आर्गुमेंट के रूप में निर्दिष्ट नहीं करते
  • "self" को किसी अन्य आर्गुमेंट में आर्गुमेंट के रूप में उपयोग करते हैं

आइए इनमें से प्रत्येक परिदृश्य के माध्यम से एक-एक करके चलते हैं।

परिदृश्य #1: "self" आर्गुमेंट के रूप में सूचीबद्ध नहीं है

"self" को आर्गुमेंट के रूप में सूचीबद्ध किया जाना चाहिए ताकि यह मेथड में एक्सेसिबल हो। "self" एक ग्लोबल वेरिएबल नहीं है। यह क्लास के अंदर लोकल है।

एक प्रोग्राम लिखें जो एक क्लास में फिल्मों के बारे में जानकारी रखता है। हम अपने क्लास को एक कंस्ट्रक्टर के साथ परिभाषित करके शुरू करते हैं जो हमारी फिल्म के बारे में मान रखता है:

class Movie:
    def __init__(self, name, year_released):
        self.name = name
        self.year_released = year_released

हमारा क्लास दो मान रख सकता है: एक फिल्म का नाम और वह वर्ष जिसमें यह रिलीज़ हुई थी। अगला, हम एक मेथड घोषित करते हैं जो हमें "year_released" के मान को बदलने देता है:

def change_year(year_released):
    self.year_released = year_released
    print("{} was released in {}.".format(self.name, self.year_released))

अपने कोड का परीक्षण करने के लिए, हम अपने क्लास का एक ऑब्जेक्ट बनाते हैं। यह ऑब्जेक्ट हैप्पी गिलमोर फिल्म को दर्शाता है, जो 1996 में रिलीज़ हुई थी:

happy_gilmore = Movie("Happy Gilmore")
happy_gilmore.change_year(1996)

हमने change_year() मेथड को अपने ऑब्जेक्ट पर कॉल किया है ताकि हम फिल्म के रिलीज़ वर्ष को 1996 पर सेट कर सकें। आइए अपना कोड चलाते हैं और देखते हैं कि क्या यह काम करता है:

Traceback (most recent call last):
File "main.py", line 11, in 
    happy_gilmore.change_year()
File "main.py", line 7, in change_year
    self.year_released = year_released
NameError: name 'self' is not defined

हमारा कोड एक त्रुटि लौटाता है।

यह त्रुटि उठाई जाती है क्योंकि हमने अपने मेथड में "self" को आर्गुमेंट के रूप में पास नहीं किया है। हम "self" को change_year() मेथड में पहले आर्गुमेंट के रूप में जोड़कर इस त्रुटि को ठीक करते हैं:

def change_year(self, year_released):
    self.year_released = year_released
    print("{} was released in {}.".format(self.name, self.year_released))

हमारा कोड फिर से चलाएं:

Happy Gilmore was released in 1996.

हमारा कोड सफलतापूर्वक चलता है!

परिदृश्य #2: "self" को किसी अन्य आर्गुमेंट में आर्गुमेंट के रूप में उपयोग करना

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

हमारे "year_released" मेथड को अपडेट करें ताकि, यदि रिलीज़ का एक अलग वर्ष निर्दिष्ट नहीं किया गया है, तो कंसोल पर एक संदेश प्रिंट हो जो हमें बताता है कि फिल्म का वर्ष नहीं बदला गया है।

हम इसे अपने कोड में डिफ़ॉल्ट आर्गुमेंट सेट करके कर सकते हैं:

def change_year(self, year_released=self.year_released):
    if year_released != self.year_released:
        self.year_released = year_released
        print("{} was released in {}.".format(self.name, self.year_released))
    else:
        print("This movie has not been changed.")
    print(year_released)

"year_released" का अब डिफ़ॉल्ट मान "self.year_released" है। इसका अर्थ है कि यदि हम वह मान निर्दिष्ट नहीं करते हैं जिस पर वर्ष को बदला जाना चाहिए, तो एक डिफ़ॉल्ट मान सेट हो जाता है। यदि हम कोई मान निर्दिष्ट करते हैं, तो हमारे द्वारा निर्दिष्ट मान डिफ़ॉल्ट के बजाय उपयोग किया जाता है।

यदि हमारे द्वारा निर्दिष्ट मान "self.year_released" के मान के बराबर नहीं है, तो "self.year_released" का मान बदल जाता है। अन्यथा, उपयोगकर्ता को बताने वाला एक संदेश कंसोल पर प्रिंट होता है कि फिल्म नहीं बदली गई है।

हमारे if स्टेटमेंट का मूल्यांकन होने के बाद, "year_released" का मान कंसोल पर प्रिंट होता है।

आइए अपना कोड चलाते हैं:

Traceback (most recent call last):
File "main.py", line 1, in 
    class Movie:
File "main.py", line 6, in Movie
    def change_year(self, year_released=self.year_released):
NameError: name 'self' is not defined

हमारा कोड एक त्रुटि उठाता है। ऐसा इसलिए है क्योंकि हमने अपनी आर्गुमेंट्स की सूची में "self" को किसी अन्य आर्गुमेंट में उपयोग करने का प्रयास किया है।

हम इस त्रुटि को अपने फ़ंक्शन के अंदर "year_released" वेरिएबल का मान "self.year_released" पर सेट करके ठीक कर सकते हैं बजाय इसे हमारी आर्गुमेंट्स की सूची में:

def change_year(self, year_released=None):
    if year_released != self.year_released:
        self.year_released = year_released
        print("{} was released in {}.".format(self.name, self.year_released))
    else:
        year_released = self.year_released
        print("This movie has not been changed.")
    print(year_released)

इस कोड में, यदि हम अपने फ़ंक्शन कॉल में "year_released" के लिए कोई मान निर्दिष्ट नहीं करते हैं तो हम "year_released" को "self.year_released" के बराबर सेट करते हैं।

आइए अपने कोड का परीक्षण करने के लिए एक नया Movie ऑब्जेक्ट बनाते हैं:

happy_gilmore = Movie("Happy Gilmore", 1995)
happy_gilmore.change_year(1996)

हमने हैप्पी गिलमोर के रिलीज़ वर्ष को गलती से 1995 निर्दिष्ट किया है। हमें इसे change_year() मेथड का उपयोग करके बदलने की आवश्यकता है। हमारा कोड लौटाता है:

Happy Gilmore was released in 1996.
1996

हमारा कोड सफलतापूर्वक निष्पादित हुआ। आइए अपना कोड यह देखने के लिए टेस्ट करते हैं कि क्या होता है यदि "year_released" का मान पहले से ही उस मान के बराबर है जिसे हम change_year() मेथड में निर्दिष्ट करते हैं:

happy_gilmore = Movie("Happy Gilmore", 1996)
happy_gilmore.change_year(1996)

हमारा कोड लौटाता है:

This movie has not been changed.
1996

हमारा कोड हमारे कोड में else स्टेटमेंट निष्पादित करता है और फिर हमें बताता है कि फिल्म नहीं बदली गई है।

निष्कर्ष

"NameError: name 'self' is not defined" त्रुटि तब उठाई जाती है जब आप "self" को पोजिशनल आर्गुमेंट के रूप में निर्दिष्ट करना भूल जाते हैं या जब आप "self" को आर्गुमेंट्स की सूची में किसी अन्य आर्गुमेंट में उपयोग करते हैं।

आप इस त्रुटि को हल करते हैं यह सुनिश्चित करके कि एक फ़ंक्शन में "self" का उपयोग करने वाले सभी मेथड्स उनकी आर्गुमेंट्स की सूची में "self" शामिल करते हैं। यदि वह काम नहीं करता है, तो सुनिश्चित करें कि आर्गुमेंट्स की सूची में कोई आर्गुमेंट अपने डिफ़ॉल्ट मानों के लिए "self" पर निर्भर नहीं करते हैं।

अब आप इस पायथन त्रुटि को एक पेशेवर डेवलपर की तरह हल करने के लिए तैयार हैं!

  1. - पायथन में मिन स्टैक

    यहां हम देखेंगे कि कैसे एक स्टैक बनाया जाए जो पुश, पॉप, टॉप, और न्यूनतम तत्व को स्थिर समय में प्राप्त कर सके। फंक्शन होंगे push(x), pop(), top() और getMin()। हल करने के चरण स्टैक को अनंत के रूप में न्यूनतम तत्व से आरंभ करें पुश ऑपरेशन push(x) के लिए यदि x < min, तो min := x अपडेट करें, x को स्टैक

  1. पायथन में इनहेरिटेंस (Inheritance) पायथन में इनहेरिटेंस (Inheritance)

    इस लेख में, हम पायथन 3.x या उससे पहले के संस्करण में इनहेरिटेंस और क्लासेस को एक्सटेंड करने के बारे में जानेंगे।इनहेरिटेंस वास्तविक दुनिया के संबंधों को अच्छी तरह से दर्शाता है, पुन: प्रयोज्यता प्रदान करता है और ट्रांजिटिविटी का समर्थन करता है। यह तेज़ विकास समय, आसान रखरखाव और विस्तार में आसानी प्र

  1. - पायथन में NameError एक्सेप्शन कैसे पकड़ें?

    NameErrors तब उठाए जाते हैं जब आपका कोड किसी ऐसे नाम को संदर्भित करता है जो वर्तमान स्कोप में मौजूद नहीं है। उदाहरण के लिए, एक अनक्वालिफाइड वेरिएबल नाम। दिए गए कोड को एक्सेप्शन पकड़ने और उसका प्रकार खोजने के लिए निम्न प्रकार से फिर से लिखा गया है। उदाहरण import sys try: def foo(): print(