экземпляр не имеет атрибута

я новичок в python и изо всех сил пытаюсь понять, почему я продолжаю получать «AttributeError: экземпляр рабочего не имеет атрибута« workerNo »», когда я вызываю main().

beltLength = 5

class worker:
    def __init__(self, wId):
        workerNo = wId

def main():
    production_Line = productionLine()
    workers = []
    for index in xrange(0, beltLength*2):
        workers.append(worker(index))  
        print workers[index].workerNo 

Я думаю, что он должен добавить 10 новых рабочих экземпляров с атрибутом workerNo, который равен индексу в списке. Спасибо


person user3376646    schedule 03.03.2014    source источник
comment
В __init__: self.workerNo = wid - в вашем коде отсутствует self.. Общая ошибка.   -  person pasztorpisti    schedule 04.03.2014
comment
Кроме того: поскольку вы используете 2.7, вы всегда должны делать свои классы подклассами object, то есть class worker(object):. Это освободит волшебных пони .   -  person DSM    schedule 04.03.2014


Ответы (2)


Проблема здесь в том, что вы используете локальную переменную вместо переменной экземпляра.

Вызов функции или метода создает новое пространство имен, которое существует только на время вызова. Чтобы значение workerNo (worker_no было бы лучше в соответствии с PEP 8 , стандарт для кода Python), чтобы сохраняться после вызова метода __init__(), он должен храниться в пространстве имен, которое не испаряется.

Каждый экземпляр имеет такое пространство имен (которое создается при создании экземпляра его класса), и аргумент self (первый) для каждого вызова метода дает доступ к этому пространству имен. Итак, в вашем методе __init__() вы должны написать

self.workerNo = wId

а затем вы можете получить к нему доступ из других методов (поскольку они также получают аргумент self, относящийся к тому же пространству имен. Внешние ссылки на экземпляр также могут обращаться к атрибутам экземпляра.

person holdenweb    schedule 03.03.2014
comment
Спасибо, этот ответ дал четкое объяснение того, почему возникла проблема, которая улучшила мое понимание. - person user3376646; 04.03.2014
comment
Вот к чему мы стремимся! Рад, что это помогло. - person holdenweb; 04.03.2014

Вам нужен self перед рабочим номером.

class worker:
    def __init__(self, wId):
        self.workerNo = wId

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

person Nitish    schedule 03.03.2014