【问题标题】:instance has no attribute [closed]实例没有属性[关闭]
【发布时间】:2014-04-05 04:13:58
【问题描述】:

我是 python 新手,我很难理解为什么我在调用 main() 时不断收到“AttributeError:worker instance has no attribute 'workerNo'”。

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 属性等于列表中的索引。 谢谢

【问题讨论】:

  • __init__: self.workerNo = wid - 在您的代码中缺少self.。常见错误。
  • 旁白:由于您使用的是 2.7,因此您应该始终使您的类成为 object 的子类,即 class worker(object):。这将释放magical ponies

标签: python python-2.7 attributeerror


【解决方案1】:

您需要在您的工人编号之前使用self

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

您应该考虑阅读this excellent answer 了解原因。

【讨论】:

    【解决方案2】:

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

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

    每个实例都有这样一个命名空间(在实例化其类时创建),每个方法调用的self(第一个)参数都可以访问该命名空间。所以在你的__init__() 方法中你应该写

    self.workerNo = wId
    

    然后您可以从其他方法访问它(因为它们也接收到引用同一命名空间的self 参数。对实例的外部引用也可以访问实例属性。

    【讨论】:

    • 谢谢,这个答案提供了一个可靠的解释,说明为什么会有一个问题提高了我的理解。
    • 这就是我们的目标!很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 2012-10-07
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多