【问题标题】:Python: instance has no attributePython:实例没有属性
【发布时间】:2012-10-07 23:34:45
【问题描述】:

我在 python 的一个类中的列表有问题。这是我的代码:

class Residues:
    def setdata(self, name):
        self.name = name
        self.atoms = list()

a = atom
C = Residues()
C.atoms.append(a)

类似的东西。我收到一条错误消息:

AttributeError: Residues instance has no attribute 'atoms'

【问题讨论】:

  • 正确缩进你的代码。
  • 附带说明,如果您使用的是 Python 2.x,您应该从“对象”继承您的类,否则将来会很难找出错误行为。
  • @jsbueno:我强烈怀疑这一点。顾名思义,老式课程已经存在了很长时间,并且不知何故人们已经设法弄清楚他们的“不当行为”。
  • @martineau:我认为不再使用它们是不正确的:描述符不起作用,mro(因此调用“super”)不起作用等等。没有理由不使用新样式类,除非你的程序需要在 Python 2.1 中运行
  • @martineau:从今天开始检查 -I-won't-call-this-a-cocidence 问题:stackoverflow.com/questions/12939288/confusion-with-properties

标签: python class attributeerror


【解决方案1】:

您的类没有__init__(),因此在实例化时,属性atoms 不存在。您必须这样做 C.setdata('something') 以便 C.atoms 可用。

>>> C = Residues()
>>> C.atoms.append('thing')

Traceback (most recent call last):
  File "<pyshell#84>", line 1, in <module>
    B.atoms.append('thing')
AttributeError: Residues instance has no attribute 'atoms'

>>> C.setdata('something')
>>> C.atoms.append('thing')   # now it works
>>> 

与 Java 等语言不同,您在编译时就知道对象将具有哪些属性/成员变量,而在 Python 中,您可以在运行时动态添加属性。这也意味着同一类的实例可以具有不同的属性。

为确保您始终拥有(除非您将其弄乱,那是您自己的错)atoms 列表,您可以添加一个构造函数:

def __init__(self):
    self.atoms = []

【讨论】:

  • +1。如果他希望在调用setdata 之前设置atoms,OP 也可以添加方法def __init__(self): self.residues = []
  • 我将函数命名为 __init()_ 缺少最后一个 _ ...谢谢
【解决方案2】:

错误意味着类 Residues 没有函数调用原子。该解决方案可以如下:

class Residues:
    def setdata(self,  atoms, name=None):
        self.name = name
        self.atoms =[]

C = Residues()
C.setdata(atoms= " a ")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2013-01-09
    • 2016-06-29
    相关资源
    最近更新 更多