我试图计算加权平均值。我们刚开始OOP而且我不确定我的问题是否与该列表有关。
这是我的代码:
class WeightedAverage:
""" Class to compute weighted averages. """
def __init__(self):
""" Creates empty lists. """
scoresList = []
weightsList = []
def addScore(self,score,weight):
scoreBool = checkScore(score)
weightBool = checkWeight(weight)
if scoreBool == True and weightBool == True:
scoresList.append(score)
weightsList.append(weight)
def checkScore(scr):
if scr in range(1,10):
scrBl = True
else:
scrBl = False
return scrBl
def checkWeight(wgt):
if wgt in [0.5,1,1.5,2]:
wgtBl = True
else:
wgtBl = False
return wgtBl
def getScores(self,scoresList):
return scoresList
def getWeights(self,weightsList):
return weightsList
def getWAvg(self,scoresList,weightsList):
wAvg = [scoresList*weightsList for scoresList,weightsList in zip(scoresList,weightsList)]
return wAvg
# For testing
def main():
scoresData = [1.5,3,9.2]
weightsData = [0.5,2,1]
wAvg = scoresData.getWAvg(scoresData,weightsData)
print(wAvg) # should display 15.95/3
其中main()被定义为在我的班级中测试代码的一种方法。
当我运行main()时,我得到以下TraceBack:
Traceback (most recent call last):
File "H:\WeightAverages.py", line 58, in <module>
main()
File "H:\WeightAverages.py", line 54, in main
wAvg = scoresData.getWAvg(scoresData,weightsData)
AttributeError: 'list' object has no attribute 'getWAvg'
这是我班级的问题还是只是一个列表问题?这是我第一次编写OO代码,所以我并不完全确定这是正确的!
答案 0 :(得分:1)
你应该这样做
class WeightedAverage(object):
""" Class to compute weighted averages. """
def __init__(self):
""" Creates empty lists. """
scoresList = []
weightsList = []
def addScore(self,score,weight):
scoreBool = checkScore(score)
weightBool = checkWeight(weight)
if scoreBool == True and weightBool == True:
scoresList.append(score)
weightsList.append(weight)
def checkScore(scr):
if scr in range(1,10):
scrBl = True
else:
scrBl = False
return scrBl
def checkWeight(wgt):
if wgt in [0.5,1,1.5,2]:
wgtBl = True
else:
wgtBl = False
return wgtBl
def getScores(self,scoresList):
return scoresList
def getWeights(self,weightsList):
return weightsList
def getWAvg(self,scoresList,weightsList):
wAvg = [scoresList*weightsList for scoresList,weightsList in zip(scoresList,weightsList)]
return wAvg
# For testing
def main():
scoresData = [1.5,3,9.2]
weightsData = [0.5,2,1]
obj = WeightedAverage()
wAvg = obj.getWAvg(scoresData,weightsData)
print(wAvg)
答案 1 :(得分:1)
Manoj Jadhav的评论似乎是正确的。要调用getWAvg函数,您需要创建WeightedAverage类的实例。
这是您创建实例的代码版本,用于调用getWavg函数。另请注意我更改了getWAvg。
class WeightedAverage:
""" Class to compute weighted averages. """
def __init__(self):
""" Creates empty lists. """
scoresList = []
weightsList = []
def addScore(self,score,weight):
scoreBool = checkScore(score)
weightBool = checkWeight(weight)
if scoreBool == True and weightBool == True:
scoresList.append(score)
weightsList.append(weight)
def checkScore(scr):
if scr in range(1,10):
scrBl = True
else:
scrBl = False
return scrBl
def checkWeight(wgt):
if wgt in [0.5,1,1.5,2]:
wgtBl = True
else:
wgtBl = False
return wgtBl
def getScores(self,scoresList):
return scoresList
def getWeights(self,weightsList):
return weightsList
def getWAvg(self,scoresList,weightsList):
wAvg = sum([s*w for s,w in zip(scoresList,weightsList)]) / len(scoresList)
return wAvg
# For testing
def main():
scoresData = [1.5,3,9.2]
weightsData = [0.5,2,1]
instance = WeightedAverage()
wAvg = instance.getWAvg(scoresData,weightsData)
print(wAvg) # should display 15.95/3