2014-03-03 75 views
-1

即时通讯新的蟒蛇和我努力理解为什么我不断收到“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属性等于列表中的索引。 谢谢

+0

在'__init__':'self.workerNo = wid' - 在你的代码中缺少'self.'常见错误 – pasztorpisti

+0

另外:因为你使用的是2.7,所以你应该总是让你的类的子类'对象',即'类工人(对象):'。这将设置自由[神奇小马](http://stackoverflow.com/questions/2588628/what-is-the-purpose-of-subclassing-the-class-对象在python) – DSM

回答

0

这里的问题是,当您应该使用实例变量时,您正在使用局部变量。

调用函数或方法会创建一个新的名称空间,该名称空间仅在调用期间存在。为了保持workerNoworker_no根据PEP 8,Python代码的标准)的值更好地保持在__init__()方法调用之外,它必须存储在不会蒸发的名称空间中。

每个实例都有这样一个名称空间(在实例化它的类时创建),并且每个方法调用的self(第一个)参数都可以访问该名称空间。因此,在您__init__()方法,你应该写

self.workerNo = wId 

,然后你可以从其他的方法来访问它(因为他们还收到self参数指的是相同的命名空间。该实例的外部引用也可以访问实例属性

+0

谢谢,这个答案提供了一个可靠的解释,为什么有一个问题提高了我的理解。 – user3376646

+0

这就是我们的目标!很高兴帮助。 – holdenweb

3

你需要self之前你的workerNo。

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

你应该考虑阅读this excellent answer为什么。

相关问题