2013-11-15 9 views
6

Ecco il mio example.py di file:NameError: moduli nome globale 'myExample2' non è definita #

from myimport import * 
def main(): 
    myimport2 = myimport(10) 
    myimport2.myExample() 

if __name__ == "__main__": 
    main() 

Ed ecco myimport.py di file:

class myClass: 
    def __init__(self, number): 
     self.number = number 
    def myExample(self): 
     result = myExample2(self.number) - self.number 
     print(result) 
    def myExample2(num): 
     return num*num 

Quando eseguo example.py di file, ho il errore seguente:

NameError: global name 'myExample2' is not defined 

Come posso risolvere il problema?

+2

è necessario 'myExample2 (self, num)' e quindi fare riferimento ad esso come 'self.myExample2() ' –

risposta

6

Ecco una semplice correzione del codice.

from myimport import myClass #import the class you needed 

def main(): 
    myClassInstance = myClass(10) #Create an instance of that class 
    myClassInstance.myExample() 

if __name__ == "__main__": 
    main() 

E il myimport.py:

class myClass: 
    def __init__(self, number): 
     self.number = number 
    def myExample(self): 
     result = self.myExample2(self.number) - self.number 
     print(result) 
    def myExample2(self, num): #the instance object is always needed 
     #as the first argument in a class method 
     return num*num 
7

Vedo due errori in voi codice:

  1. È necessario chiamare myExample2 come self.myExample2(...)
  2. È necessario aggiungere self quando si definisce myExample2: def myExample2(self, num): ...
0

È necessario creare un'istanza della classe myClass, e non l'istanza dell'intero modulo (e io modifico i nomi delle variabili in modo che siano meno terribili):

from myimport import * 
def main(): 
    #myobj = myimport.myClass(10) 
    # the next string is similar to above, you can do both ways 
    myobj = myClass(10) 
    myobj.myExample() 

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

Mentre le altre risposte sono corrette, mi chiedo se c'è davvero la necessità di myExample2() essere un metodo. Si potrebbe così attuarla autonomo:

def myExample2(num): 
    return num*num 

class myClass: 
    def __init__(self, number): 
     self.number = number 
    def myExample(self): 
     result = myExample2(self.number) - self.number 
     print(result) 

O, se si vuole mantenere lo spazio dei nomi pulito, implementarlo come metodo, ma come non ha bisogno self, come @staticmethod:

def myExample2(num): 
    return num*num 

class myClass: 
    def __init__(self, number): 
     self.number = number 
    def myExample(self): 
     result = self.myExample2(self.number) - self.number 
     print(result) 
    @staticmethod 
    def myExample2(num): 
     return num*num 
0

Innanzitutto, sono d'accordo con la risposta di alKid. Questo è davvero più un commento sulla domanda che una risposta, ma non ho la reputazione di commentare.

Il mio commento:

Il nome globale che causa l'errore è myImport non myExample2

Spiegazione:

Il messaggio di errore completo generato dal mio Python 2.7 è:

Message File Name Line Position  
Traceback    
    <module> C:\xxx\example.py 7  
    main C:\xxx\example.py 3  
NameError: global name 'myimport' is not defined 

Ho trovato questa domanda quando stavo cercando di rintracciare un obs cura l'errore "nome globale non definito" nel mio codice. Poiché il messaggio di errore nella domanda è errato, ho finito per essere più confuso. Quando ho effettivamente eseguito il codice e ho visto l'errore effettivo, tutto ha avuto senso.

Spero che questo impedisca a chiunque trovi questo thread di avere lo stesso problema che ho fatto.Se qualcuno con più reputazione di me vuole trasformarlo in un commento o risolvere la domanda, sentiti libero.

+0

A tutti quelli che mi hanno castigato per non aver risposto a una domanda, mi scuso. ** TLDR: l'esempio di codice nella domanda non produce l'errore. La domanda è irrisolvibile! ** – Dennis

Problemi correlati