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

5 投票
3 回答
11376 浏览
提问于 2025-04-16 18:24

我真的搞不懂我哪里做错了,因为在“小规模”测试时,它是可以正常工作的。

我有一个叫做 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 个回答

2

你忘记初始化父类了。

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

当你从 Play 这个类继承时,你会自动获得在 Play 的定义中创建的属性,但你不会得到在 Play.__init__ 中创建的属性。你需要明确地调用它,像这样:

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

可以参考 Boldewyn 的建议,使用 super 来实现这个功能;不过我觉得你应该先熟悉继承的基本工作方式,再去玩 super

进一步说明,如果你没有像这个例子一样重写 __init__,那么它会被自动继承并调用。

12

你覆盖了原来的 __init__ 方法,这样它就不会被调用,也就无法初始化类里面的成员。你必须单独调用父类的 __init__ 方法,通常可以用下面这段代码:

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

想了解更多,可以查看 关于 super() 的文档。不过,super() 只适用于所谓的新式类。因此,你需要把 Play 的定义改成继承自 object

class Play(object)

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

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

撰写回答