我无法真正理解我做错了什么,因为当我以“小规模”尝试它并且它在那里工作时。
我有一个名为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很新,所以我可以做各种愚蠢的错误,但我无法弄清楚在哪里!
我想我已经发布了所有相关代码,但我认为错误可能在其他地方,我可以提供。
正如我所说的那样,我很新,所以这可能与继承无关我只是认为当你从另一个类中得到“某些东西”时(你现在必须在屏幕上大喊大叫) )功能
答案 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