【问题标题】:Python AttributeError: class object has no attributePython AttributeError:类对象没有属性
【发布时间】:2015-09-28 13:10:28
【问题描述】:

当我尝试运行我正在编写的类的代码时,我得到一个AttributeError,但我不知道为什么。具体报错如下:

    self.marker = self.markers[marker[1:]]
AttributeError: 'TTYFigureData' object has no attribute 'markers'

这是我正在写的课程的一部分:

class TTYFigureData(object):
    """
    data container of TTYFigure
    """
    def __init__(
        self,
        x,                      # x values
        y,                      # y values
        marker          = "_.", # datum marker
        plot_slope      = True
        ):
        self.x          = x
        self.y          = y
        self.plot_slope = plot_slope
        self.set_marker(marker)
        self.markers = {
            "-" : u"None" ,
            "," : u"\u2219"
        }

    def set_marker(
        self,
        marker
        ):
        if marker in [None, "None", u"None", ""]:
            self.plot_slope = True
            self.marker = ""
        elif marker[0] == "_":
            self.marker = self.markers[marker[1:]]
        else:
            self.marker = marker

我哪里错了?

【问题讨论】:

  • 您的代码风格有点……特殊("糟糕" 似乎有点贬义),这让人难以理解。但请注意,在初始化self.markers 之前 调用self.set_marker。鉴于self.markers 似乎已修复,为什么不将其设为类属性?
  • 请为 Python 错误发布 完整的回溯。例如,对于这种情况,set_marker() 是从 __init__ 调用的这一事实是判断出了什么问题的关键线索,回溯会显示这一点。
  • @jonsharpe 啊,就是这样!好眼力。感谢您的关注。代码很粗糙,我知道为每个函数参数换行的方法不被认为是标准的。这种方法真的那么糟糕吗,尤其是对于大量的论点?
  • @MartijnPieters 感谢您的提示。你说的很对。
  • @d3pd:是的,例如,它很难区分参数列表和方法体。请务必阅读Python styleguide,它提供了更好的选择。

标签: python class attributes attributeerror


【解决方案1】:

在您的__init__ 方法中,您调用self.set_marker() 您设置self.markers

self.set_marker(marker)
self.markers = {
    "-" : u"None" ,
    "," : u"\u2219"
}

所以当set_marker() 运行时,没有self.markers 。将呼叫下移一行:

self.markers = {
    "-" : u"None" ,
    "," : u"\u2219"
}
self.set_marker(marker)

【讨论】:

  • 非常感谢您提供明确的解决方案。错过这是一件愚蠢的事情。
【解决方案2】:

Martijn's answer 解释问题并给出最小解决方案。但是,鉴于 self.markers 似乎是恒定的,我会将其设为 类属性,而不是为每个实例重新创建它:

class TTYFigureData(object):
    """Data container of TTYFigure."""

    MARKERS = {
        "-": u"None" ,
        ",": u"\u2219",
    }

    def __init__(self, x, y, marker='_.', plot_slope=True):
        """Document parameters here as required."""
        self.x = x
        self.y = y
        self.plot_slope = plot_slope
        self.set_marker(marker)

    def set_marker(self, marker):
        """See also here - usage guidance is also good."""
        if marker in [None, "None", u"None", ""]:
            self.plot_slope = True
            self.marker = ""
        elif marker[0] == "_":
            self.marker = self.MARKERS[marker[1:]]
        else:
            self.marker = marker

(请注意样式也与the official guidance一致)

【讨论】:

  • 感谢您提供明确的解决方案,并为将标记属性从实例属性更改为类属性提供指导。
猜你喜欢
  • 2021-08-20
  • 2020-09-11
  • 2018-11-19
  • 1970-01-01
  • 2017-05-30
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
相关资源
最近更新 更多