2012-01-10 16 views
7

Ho il seguente codice, che ha i seguenti due problemi:metodo principale pitone

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 

Questo codice è da un tutorial, e nel tutorial funziona bene. Ho il Python 2.7 e uso il plugin PyDev per Eclipse.

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

Potete fornire un collegamento a questo tutorial? Chiunque lo abbia scritto dovrebbe essere fucilato, o almeno bandito dalla scrittura. Questo * non * come scrivi proprietà di classe in Python. –

+2

Ascolta Daniel e cerca il decoratore '@ property' in Python. Non devi scrivere getter e setter del genere. – katrielalex

+0

Inoltre, non usare nomi a doppio trattino - sono lì per un caso d'uso molto particolare. Se si desidera indicare che una proprietà è "solo per uso interno", utilizzare invece single-underscoring. – katrielalex

risposta

33

Questo codice:

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


if __name__ =='__main__':main() 

non dovrebbe essere in classe. Quando lo porti fuori (nessun rientro) dovrebbe funzionare.

Così, dopo aver preso in considerazione che dovrebbe assomigliare a questo:

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

Spostare sia il metodo main() e la if __name__ == '__main__' dichiarazione fuori del campo di applicazione della classe. Ricorda: lo spazio bianco conta.

+3

La programmazione come Guido la rientranza, per così dire. – grifaton

1

Il rientro è disattivato. Ricorda che in Python conta l'indentazione. Prova:

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

Il seguente costrutto vale la pena avere nella maggior parte del codice - in particolare se si esegue in più ambienti.

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

La funzione principale definita è simile alla classe Animale. Principale dovrebbe essere una funzione (le classi contengono metodi) al di fuori della classe animale. Si dovrebbe anche avere il vostro animale classe di ereditare da oggetti cioè

Animal classe (oggetto):

22

Per comprendere perché quello che hai scritto fallito, è necessario conoscere un po 'su come le definizioni di classi funzionano in Python. Come forse saprai, Python è un linguaggio interpretato: esiste un programma che legge i file Python e li esegue come funziona. Quando l'interprete incontra una definizione di classe, lo fa il seguente:

  1. di creare un nuovo spazio dei nomi (record di tutti i nomi delle variabili), in cui verranno memorizzate le variabili ei metodi della classe.
  2. Estrae tutto il codice all'interno della definizione di classe (come determinato dalla sua indentazione) ed esegue quel codice. Questo popolerà lo spazio dei nomi che ha appena creato.
  3. Crea un nuovo oggetto di classe il cui spazio dei nomi è quello sopra indicato e con le classi di base quelle indicate nella definizione.
  4. Associa il nome della classe a questo oggetto.

Quindi, cosa è successo quando si è rientrata la funzione main all'interno del codice? Mentre all'interno del passaggio 2, hai fatto riferimento al nome Animal. Ma questo nome non è definito fino al punto 4! Infatti, è impossibile definire nella fase in cui ci si è riferito, perché sarebbe circolare. Quando si sposta main al di fuori della definizione della classe, non verrà eseguito fino a quando non saranno stati completati i passaggi 1-4, quindi il nome Animal sarà già associato.


A proposito, il codice che hai scritto non è un buon Python. Probabilmente dovresti provare a trovare un tutorial migliore; la solita raccomandazione è "Dive Into Python". L'ho riscritta come dovrebbe:

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 - Informazioni molto utili per la persona che vuole imparare perché le cose non funzionavano. – istruble

Problemi correlati