错误:尝试从类继承时“x实例没有属性y”

时间:2011-05-26 19:00:38

标签: python inheritance attributes instance

我无法真正理解我做错了什么,因为当我以“小规模”尝试它并且它在那里工作时。

我有一个名为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很新,所以我可以做各种愚蠢的错误,但我无法弄清楚在哪里!

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

正如我所说的那样,我很新,所以这可能与继承无关我只是认为当你从另一个类中得到“某些东西”时(你现在必须在屏幕上大喊大叫) )功能

3 个答案:

答案 0 :(得分:12)

您覆盖原始__init__,然后从未调用,并且不会初始化成员。您必须单独调用父级__init__,通常使用此代码段:

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

有关详细信息,请参阅docs for super()。但是,super()仅适用于所谓的新式类。因此,您必须将Play的定义更改为继承自object

class Play(object)

或直接调用父方法:

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

答案 1 :(得分:4)

当您从类Play继承时,您会自动获取您在Play定义中创建的属性,但是您没有获得属性您在Play.__init__中创建的。你必须明确地这样称呼它:

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

Boldewyn's suggestion使用super执行此操作;但IMO你应该习惯继承基本的方式,然后摆弄super

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

答案 2 :(得分:2)

你忘了初始化超类。

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