2013-02-10 29 views
31

मैं एक अजगर स्क्रिप्ट है और मैं निम्नलिखित त्रुटि मिल रही है:अजगर NameError: नाम से परिभाषित नहीं है

s = Something() 
s.out() 

class Something: 
    def out(): 
     print("it works") 

यह किया जा रहा रन है:

Traceback (most recent call last): 
    File "C:\Users\Tim\Desktop\pop-erp\test.py", line 1, in <module> 
    s = Something() 
    NameError: name 'Something' is not defined 

यहाँ कोड है कि समस्या का कारण बनता है विंडोज 7 x86-64 के तहत पायथन 3.3.0 के साथ।

Something कक्षा क्यों नहीं मिल सकती है?

+4

इस समस्या का समाधान आप को परिभाषित करने के बाद अपने वर्गों और कार्यों को आमंत्रित करना है। पाइथन के पास कक्षाओं या विधियों की घोषणा करने का कोई तरीका नहीं है, इसलिए शुरुआत का बजाए कार्यक्रम के अंत में कार्यों का आविष्कार करना एकमात्र विकल्प है। दूसरा विकल्प आपकी विधियों को अपनी फाइल के शीर्ष पर आयातित पुस्तकालयों में रखना है जो हमेशा पहले कहलाते हैं। –

उत्तर

52

वर्ग को परिभाषित करने से पहले आप इसे उपयोग:

class Something: 
    def out(self): 
     print("it works") 

s = Something() 
s.out() 

आप self सभी उदाहरण के तरीकों के लिए सबसे पहले तर्क के रूप में पारित करने के लिए की जरूरत है।

+0

उत्कृष्ट, धन्यवाद! मैं स्वयं को शामिल करना चाहता था, बस भूल गया जब मैंने जल्दी ही इस संक्षिप्त उदाहरण को लिखा। – user1899679

+0

अच्छी तरह से नहीं * सभी * विधियां। चीजों को दिलचस्प रखने के लिए हमेशा '@ staticmethod' और' @ classmethod' है :-P – mgilson

+0

@mgilson और भी मजेदार के लिए, 'self' * * @ classmethod' के साथ काम करेगा, यह सिर्फ एक गलत नामक होगा (होना चाहिए 'सीएलएस' कहा जाता है)। – delnan

2

कक्षा के उदाहरण बनाने से पहले आपको कक्षा को परिभाषित करना होगा। स्क्रिप्ट के अंत में Something के आविष्कार को ले जाएं।

आप घोड़े से पहले गाड़ी डाल दिया और प्रक्रियाओं को लागू करने से पहले वे परिभाषित कर रहे हैं करने के लिए कोशिश कर सकते हैं, लेकिन यह एक बदसूरत हैक होगा और आप के रूप में यहां बताए गए अपने खुद के रोल करना होगा:

Make function definition in a python file order independent