Ошибка: «экземпляр x не имеет атрибута y» при попытке наследовать от класса - PullRequest
5 голосов
/ 26 мая 2011

Я не могу понять, что я делаю неправильно, потому что, когда я пробую это в «мелком масштабе», и это работает там.

У меня есть класс с именем 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]

Я очень плохо знаком с ООП, поэтому я мог делать все виды глупых ошибок, но я не могу понять где!

Я думаю Я разместил весь соответствующий код, но я думаю, что вы, возможно, ошибка в другом месте, я могу предоставить ее.

Как я сказал, яЯ очень новичок, так что это может не иметь ничего общего с наследованием. Я просто думаю, что это называется, когда вы получаете «что-то» из другого класса (сейчас вы должны кричать на экран)

Ответы [ 3 ]

12 голосов
/ 26 мая 2011

Вы перезаписываете исходное __init__, которое затем никогда не вызывается и не инициализирует элементы.Вы должны позвонить родителю __init__ отдельно, обычно с этим фрагментом:

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

См. Документы для super() для получения подробной информации.Однако super() работает только для так называемых классов нового стиля.Поэтому вы должны либо изменить определение Play для наследования от object:

class Play(object)

, либо напрямую вызвать метод родителя:

def __init__(self):
    Play.__init__(self)
4 голосов
/ 26 мая 2011

Когда вы наследуете от класса Play, вы автоматически получаете атрибуты, которые вы создали в определении из Play, но вы не получаете атрибуты, которые вы создалив Play.__init__.Вы должны явно назвать это так:

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

См. предложение Болдевина относительно использования super для этого;но IMO, вы, вероятно, должны привыкнуть к базовому способу наследования, прежде чем возиться с super.

Чтобы уточнить, если вы не переопределите __init__, как в этом случае, то он наследуется ивызывается автоматически.

2 голосов
/ 26 мая 2011

Вы забыли инициализировать суперкласс.

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