2015-07-19 3 views
0

У меня есть проблемы со следующим кодом, он говорит: «NameError: глобальное имя„Teater“не определен» Я не могу решить сам ...глобальное имя NAME не определен ПИТОН

teaterLista = [] 
lista = [] 
class Teater: 


    def __init__(self, teaterNamn, plats, pensionar,vuxen,barn): 
     self.teaterNamn = teaterNamn 
     self.plats = plats 
     self.pensionar = pensionar 
     self.vuxen = vuxen 
     self.barn = barn 

    def readData(): 
     #x = Teater(x,teaterNamn, plats,pensionar,vuxen,barn) 
     dataFile = open('c:/Teater.txt','r') 
     for line in dataFile: 
      if(line != '\n'): 
        temp = line.split('=',1)[1] 
        lista.append(temp.strip()) #strip tar bort radavslut 

     x = Teater(x,lista[0],lista[1],lista[2],lista[3],lista[4]) 
    #teaterLista[0] = x 
    #print(teaterLista[0]) 

    readData() 
+0

x = Teater (x, lista [0], lista [1], lista [2], lista [3], lista [4]) Эта строка не работает, im пытается создать новый isntance Teater с помощью заданные параметры. – user2432626

+0

Выполняет ли вызов 'readData' вне класса' Teater'? Возможно, вам придется сделать какой-то рефакторинг, чтобы сделать это - метод readData может не принадлежать этому классу, читая несколько «Teater's» на экземпляре одного –

+0

Нет, readData не работает вне класса. «имя« readData »не определено». Как вы думаете, он будет работать, если я сделаю основной метод и прочитаю данные оттуда? – user2432626

ответ

1

Вы вызовите readData() во время определения класса. В Python тело класса выполняется во время его определения в contex определения класса так же, как и обычный код. Поскольку класс не полностью определен в этот момент, вы не можете создать новый экземпляр, но, тем самым, получите ошибку.

Выделение всего определения для readData и следующей строки, поэтому все это выполняется после определение класса завершено. Это делает readLine функцией уровня модуля, а не методом класса. Это типично для заводской функции.

teaterLista = [] 
lista = [] 
class Teater: 

    def __init__(self, teaterNamn, plats, pensionar,vuxen,barn): 
     self.teaterNamn = teaterNamn 
     self.plats = plats 
     self.pensionar = pensionar 
     self.vuxen = vuxen 
     self.barn = barn 

def readData(): 
    #x = Teater(x,teaterNamn, plats,pensionar,vuxen,barn) 
    dataFile = open('c:/Teater.txt','r') 
    for line in dataFile: 
     if(line != '\n'): 
       temp = line.split('=',1)[1] 
       lista.append(temp.strip()) #strip tar bort radavslut 

    x = Teater(lista[0],lista[1],lista[2],lista[3],lista[4]) 
#teaterLista[0] = x 
#print(teaterLista[0]) 

readData() 

Примечание: x = Teater(x, ... не будет работать, так как x не определен для первого вызова. Если вы подумали о том, чтобы указать это для аргумента self: нет необходимости; это делается неявно. Вы должны прочитать, как работают классы в документации/учебнике.

Вы должны быть осторожны в Python, чтобы правильно отпечатать свой код, поскольку это определяет область блока.

+0

Если я сдал эту строку, то «NameError: name« readData »не определен» – user2432626

+0

@ user2432626: Да, я допустил ошибку в своем тексте. Вы должны выделить определение всей функции. Так что это не часть определения класса. – Olaf

+0

@ Олаф, вы определенно уверены в невозможности ссылаться на класс внутри себя? Пожалуйста, посмотрите/попробуйте код в моем ответе. – Pynchia

Смежные вопросы