2012-01-10 20 views
7

में मैं निम्नलिखित कोड है, जो निम्नलिखित दो समस्याएं हैं:मुख्य विधि पायथन

Traceback (most recent call last): 
    File "C:\Users\v\workspace\first\src\tests.py", line 1, in <module> 
    class Animal: 
    File "C:\Users\v\workspace\first\src\tests.py", line 39, in Animal 

    File "C:\Users\v\workspace\first\src\tests.py", line 31, in main 
    dog = Animal() 
NameError: global name 'Animal' is not defined 

इस कोड को एक ट्यूटोरियल से है, और ट्यूटोरियल में यह ठीक काम करता है। मेरे पास पाइथन 2.7 है और ग्रहण के लिए PyDev प्लगइन का उपयोग करें।

class Animal: 
    __hungry = "yes" 
    __name = "no name" 
    __owner = "no owner" 

    def __init__(self): 
     pass 

    def set_owner(self,newOwner): 
     self.__owner= newOwner 
     return 

    def get_owner(self): 
     return self.__owner 

    def set_name(self,newName): 
     self.__name= newName 
     return 

    def get_name(self): 
     return self.__name 

    def noise(self): 
     print('errr') 
     return 

    def __hiddenmethod(self): 
     print("hard to find") 


    def main(): 
     dog = Animal()  
     dog.set_owner('Sue') 
     print dog.get_owner() 
     dog.noise() 


    if __name__ =='__main__':main() 
+7

क्या आप उस ट्यूटोरियल को लिंक प्रदान कर सकते हैं? जो भी इसे लिखा है उसे गोली मार दी जानी चाहिए, या कम से कम लिखने से प्रतिबंधित होना चाहिए। यह * नहीं * आप पायथन में कक्षा गुण कैसे लिखते हैं। –

+2

डैनियल को सुनें और पायथन में '@ संपत्ति' सजावट देखें। आपको ऐसे गेटर्स और सेटर्स लिखने की ज़रूरत नहीं है। – katrielalex

+0

डबल-अंडरस्कोर नामों का भी उपयोग न करें - वे एक बहुत ही विशेष उपयोग मामले के लिए हैं। यदि आप यह इंगित करना चाहते हैं कि एक संपत्ति "केवल आंतरिक उपयोग के लिए" है तो इसके बजाय एकल-अंडरस्कोरिंग का उपयोग करें। – katrielalex

उत्तर

33

इस कोड:

def main(): 
    dog = Animal()  
    dog.set_owner('Sue') 
    print dog.get_owner() 
    dog.noise() 


if __name__ =='__main__':main() 

वर्ग में नहीं होना चाहिए। जब आप इसे बाहर ले जाते हैं (कोई इंडेंट नहीं) तो इसे काम करना चाहिए।

ताकि लेने के खाते में के बाद यह इस तरह दिखना चाहिए:

class Animal: 
    __hungry = "yes" 
    __name = "no name" 
    __owner = "no owner" 

    def __init__(self): 
     pass 

    def set_owner(self,newOwner): 
     self.__owner= newOwner 
     return 

    def get_owner(self): 
     return self.__owner 

    def set_name(self,newName): 
     self.__name= newName 
     return 

    def get_name(self): 
     return self.__name 

    def noise(self): 
     print('errr') 
     return 

    def __hiddenmethod(self): 
     print("hard to find") 


def main(): 
    dog = Animal()  
    dog.set_owner('Sue') 
    print dog.get_owner() 
    dog.noise() 


if __name__ =='__main__': 
    main() 
1

ले जाएँ दोनों main() विधि और वर्ग के दायरे से बाहर if __name__ == '__main__' बयान। याद रखें - व्हाइटस्पेस गिना जाता है।

+3

गुइडो के रूप में प्रोग्रामिंग ने इसे इंडेंट किया, जैसा कि यह था। – grifaton

1

आपका इंडेंटेशन बंद है। याद रखें कि पायथन में, इंडेंटेशन गिना जाता है। आज़माएं:

class Animal: 
    __hungry = "yes" 
    __name = "no name" 
    __owner = "no owner" 

    def __init__(self): 
     pass 

    def set_owner(self,newOwner): 
     self.__owner= newOwner 
     return 

    def get_owner(self): 
     return self.__owner 

    def set_name(self,newName): 
     self.__name= newName 
     return 

    def get_name(self): 
     return self.__name 

    def noise(self): 
     print('errr') 
     return 

    def __hiddenmethod(self): 
     print("hard to find") 

def main(): 
    dog = Animal()  
    dog.set_owner('Sue') 
    print dog.get_owner() 
    dog.noise() 


if __name__ =='__main__':main() 
2

निम्नलिखित निर्माण आपके अधिकांश कोड में होने के लायक है - खासकर अगर आप कई वातावरण में चल रहे हैं।

if __name__ =='__main__': 
    main() 
0

आपके द्वारा परिभाषित मुख्य कार्य ऐसा लगता है कि यह पशु वर्ग के भीतर है। मुख्य पशु वर्ग के बाहर एक समारोह (कक्षाएं विधियों) होनी चाहिए।

22

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

वर्ग पशु (वस्तु) वस्तु से विरासत होना चाहिए। जैसा कि आप जानते हैं, पायथन एक व्याख्या की गई भाषा है: एक प्रोग्राम है जो पाइथन फाइलों के माध्यम से पढ़ता है और इसे चलाता है। जब दुभाषिया वर्ग परिभाषा का सामना करता है, तो यह निम्न कार्य करता है:

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

तो क्या हुआ जब आपने अपने कोड के अंदर main फ़ंक्शन को इंडेंट किया? चरण 2 के अंदर, आपने Animal नाम का उल्लेख किया है। लेकिन यह नाम चरण 4 तक परिभाषित नहीं किया गया है! वास्तव में, यह को उस चरण में परिभाषित नहीं किया जा सकता है जिसे आपने संदर्भित किया है, क्योंकि यह परिपत्र होगा। जब आप कक्षा परिभाषा के बाहर main स्थानांतरित करते हैं, तब तक इसे 1-4 चरणों के पूरा होने तक निष्पादित नहीं किया जाएगा, और इसलिए Animal नाम पहले से ही बाध्य होगा।


वैसे, आपके द्वारा लिखे गए कोड अच्छे पायथन नहीं हैं। आपको शायद एक बेहतर ट्यूटोरियल खोजने की कोशिश करनी चाहिए; सामान्य सिफारिश "पाइथन में गोता लगाएँ" है। मैंने इसे फिर से लिखा है क्योंकि इसे किया जाना चाहिए:

class Animal(object): 
    def __init__(self, hungry="yes", name=None, owner=None): 
      self.hungry = hungry 
      self.name = name 
      self.owner = owner 

    def noise(self): 
        print('errr') 

    def _internal_method(self): 
        print("hard to find") 

    if  __name__ =='__main__': 
      dog = Animal()     
      dog.owner = 'Sue' 
      print dog.owner 
      dog.noise() 
+3

+1 - उस व्यक्ति के लिए बहुत उपयोगी जानकारी जो जानना चाहती है कि चीजें क्यों काम नहीं कर रही थीं। – istruble

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