List对象具有自定义类中的方法的AttributeError

时间:2017-12-06 04:35:41

标签: python python-3.x list class object-oriented-analysis

我试图计算加权平均值。我们刚开始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代码,所以我并不完全确定这是正确的!

2 个答案:

答案 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