【问题标题】:Error: "x instance has no attribute y" when trying to inherit from class错误:尝试从类继承时“x 实例没有属性 y”
【发布时间】:2011-05-26 19:00:37
【问题描述】:

我真的不明白我做错了什么,因为当我以“小规模”尝试它并且它在那里工作时。

我有一个名为Play()的班级

我是这样的:

class Play():
    def __init__(self):
        file = open("/home/trufa/Desktop/test", "r")
        self.word = random.choice(file.readlines()).rstrip()
        self.errAllowed = 7
        self.errMade = 0
        self.errList = []
        self.cheatsAllowed = 2##chetas not incrementing
        self.cheatsMade =0
        self.wordList = ["*"]*len(self.word) ##this one is the one I want to have available in another class

...

然后我有另一个类叫Score()

class Score(Play):
    def __init__(self):
        self.initialScore = 0

    def letterGuess(self):
        self.initialScore += 1
        return self.errList

...

我都实例化了:

game = Play()
points = Score()

如果我这样做:

print points.letterGuess()

它给了我一个错误:

Traceback (most recent call last):
  File "/home/trufa/workspace/hangpy/src/v2.py", line 188, in <module>
    startGame()
  File "/home/trufa/workspace/hangpy/src/v2.py", line 134, in startGame
    print points.letterGuess()
  File "/home/trufa/workspace/hangpy/src/v2.py", line 79, in letterGuess
    return self.errList
AttributeError: Score instance has no attribute 'errList'

我不明白为什么,因为我可以毫无困难地做到这一点:

class One():
    def __init__(self):
        self.list= [1,2]

class Two(One):
    def meth(self):
        return self.list

uan = One()
tu = Two()

print uan.list 
print tu.meth() ## Both output [1,2]

我对 OOP 很陌生,所以我可能会犯各种愚蠢的错误,但我不知道在哪里!

认为我已经发布了所有相关代码,但我认为错误可能在其他地方,我可以提供。

正如我所说,我很新,所以这可能与继承无关)

【问题讨论】:

  • 你能做到return Play.errlist吗?
  • @Matt:他不是,因为该类没有该名称的类变量。
  • print tu.meth() ## Both output [1,2] 不要吸毒。药物不好。

标签: python inheritance attributes instance


【解决方案1】:

您覆盖了原来的__init__,然后它就永远不会被调用并且不会初始化成员。你必须单独打电话给父母的__init__,通常用这个sn-p:

def __init__(self):
    super(Score, self).__init__()

详情请参阅docs for super()。但是,super() 仅适用于所谓的新式类。因此,您必须更改 Play 的定义以从 object 继承:

class Play(object)

或者直接调用父类的方法:

def __init__(self):
    Play.__init__(self)

【讨论】:

  • 为了进一步澄清,您必须从 2.x 中的 object 继承。在 3.x 中,old-style classes go away,因此从 object 继承是不必要的。
  • @senderle:是的,谢谢。我应该开始尊重 3 而不是给定的,使用 2.x。
  • 我还没搞懂super()怎么用,不是你建议的this
  • @Bolderwyn,我自己也在努力做到这一点——因此发表了评论。 :)
【解决方案2】:

当您从类Play 继承时,您会自动获得您在Play定义 中创建的属性,但您不会获得您已经拥有的属性创建于Play.__init__。您必须像这样显式调用它:

class Score(Play):
    def __init__(self):
        Play.__init__(self)
        self.initialScore = 0

请参阅 Boldewyn's suggestion 以使用 super 执行此操作;但是 IMO 在摆弄super 之前,您可能应该习惯继承的基本工作方式。

为了进一步澄清,如果您没有像在这种情况下那样覆盖 __init__,那么它会被继承并自动调用。

【讨论】:

  • 非常感谢,我相信这很明显,但我猜你必须在某个时候学习它:) +1 第一个正确答案!
【解决方案3】:

你忘记初始化超类了。

class Score(Play):
  def __init__(self):
    super(Score, self).__init__()
    self.initialScore = 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2017-02-09
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多