错误:“x实例没有属性y” 在尝试继承类时
我真的搞不懂我哪里做错了,因为在“小规模”测试时,它是可以正常工作的。
我有一个叫做 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)