【问题标题】:List object has AttributeError for a method in a self-defined classList 对象对自定义类中的方法有 AttributeError
【发布时间】:2017-12-06 04:35:40
【问题描述】:

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

【问题讨论】:

  • 您是否错过了 WeightedAverage 实例的创建?
  • 这对我来说在 Py2.7 和 Py3.6 下运行没有错误。你更新你的代码了吗?
  • 不,但我确实尝试了@ManojJadhav 的建议,并且奏效了。

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


【解决方案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)

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 感谢您的解释!
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2019-02-14
    • 2015-06-17
    • 2023-04-09
    • 2014-09-08
    • 2016-01-30
    相关资源
    最近更新 更多