NameError: नाम 'self' परिभाषित नहीं है


145

ऐसी संरचना क्यों

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

कोई त्रुटि देता है NameError: name 'self' is not defined?

जवाबों:


159

डिफ़ॉल्ट तर्क मानों का मूल्यांकन फ़ंक्शन डिफाइन-टाइम में किया जाता है, लेकिन selfएक तर्क केवल फ़ंक्शन कॉल समय पर उपलब्ध है। इस प्रकार तर्क सूची में तर्क एक दूसरे को संदर्भित नहीं कर सकते।

किसी तर्क को डिफ़ॉल्ट रूप Noneसे कोड में परीक्षण के लिए जोड़ना और जोड़ना एक सामान्य पैटर्न है :

def p(self, b=None):
    if b is None:
        b = self.a
    print b

4
हालांकि मुझे लगता है कि उपरोक्त बहुत सुंदर नहीं है (मैं माणिक से आता हूं जहां चीजें ठीक काम करती हैं), ऊपर वास्तव में एक समाधान के रूप में काम करता है। यह अभी भी अजीब है कि अजगर ने खुद को एक पैरामीटर सूची में अनुपलब्ध बनाने के लिए चुना।
शेवी

2
@ शेवी: "सेल्फ" का अजगर में कोई विशेष अर्थ नहीं है, यह सिर्फ पारंपरिक रूप से पहले तर्क के लिए चुना गया नाम है। आप "मुझे" या "x" द्वारा "स्व" को भी बदल सकते हैं।
अधिकतम

क्या ऐसा करने का कोई बेहतर तरीका नहीं है? यदि हमारे पास एक फ़ंक्शन है जो एक दर्जन डिफ़ॉल्ट तर्क लेता है जो स्वयं को संदर्भित करना चाहिए, तो क्या हमें बयानों के लिए वास्तव में एक दर्जन की आवश्यकता है? यह बहुत अजीब है।
रिचर्ड जे। बर्बलेस

16

उन मामलों के लिए जहां आप किसी को भी 'बी' सेट करने का विकल्प देना चाहते हैं:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b

6

यदि आप Google के माध्यम से यहां पहुंचे हैं, तो कृपया यह जांचना सुनिश्चित करें कि आपने किसी वर्ग फ़ंक्शन के पहले पैरामीटर के रूप में स्वयं को दिया है। खासकर यदि आप फ़ंक्शन के अंदर उस ऑब्जेक्ट के लिए मानों को संदर्भित करने का प्रयास करते हैं।

def foo():
    print(self.bar)

> NameError: नाम 'self' परिभाषित नहीं है

def foo(self):
    print(self.bar)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.