全局名称NAME未定义PYTHON

时间:2015-07-19 22:29:43

标签: python

我遇到以下代码问题,它说“NameError:全局名称'Teater'未定义”我自己无法解决...

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()

1 个答案:

答案 0 :(得分:1)

在课程定义期间调用readData()。在Python中,类正文在类定义的上下文中定义时就像普通代码一样执行。由于此时尚未完全定义类,因此无法创建新实例,从而获得错误。

Dedent 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才能正确地缩进代码,因为它定义了块范围。