类和功能 -

问题描述 投票:0回答:3

我不确定我到底做错了什么,因为我几乎绝对肯定我已经引用了变量而且都是正确的。

我对使用函数很新,并且刚刚开始学习使用Python类。

因此,当我运行代码时,我收到此错误消息:

line 37, in pathlist
    while self.no_of_files > 0:             #self.number_of_files
AttributeError: 'int' object has no attribute 'no_of_files'

我猜它与我的顺序代码步骤有关,或者是因为我已经将numfiles输入转换为代码第20行的int()。

我在下面附上了我的代码。请提前帮助我谢谢:)

import csv
import numpy as np


''' DEFINING MAIN CONTROL'''

def main():
    no_of_files    # = number_of_files()
    a = Calculate_RMSE_Assess_Models()
    a.no_of_files()   #  = no_of_files
    a.pathlist()
    a.out_path()
    a.open_read_write_files()


''' DEFINING CLASS OF ALL '''
class Calculate_RMSE_Assess_Models:

    def __init__(self, no_of_files):
        self.no_of_files = no_of_files

    def number_of_files():
        numfiles = input("Enter the number of files to iterate through: ")
        numfilesnumber = int(numfiles)
        return numfilesnumber

    no_of_files = number_of_files()


    def pathlist(self):
        filepathlist = []
        while self.no_of_files > 0:             #self.number_of_files
            path = input("Enter the filepath of the input file: ")
            filepathlist.append(path)
            no_of_files = no_of_files - 1
        return filepathlist

    list_filepath = pathlist(no_of_files)

    def out_path():
        path = input("Enter the file path of output path: ")
        return path

    file_out_path = outpath()

    def open_read_write_files():
        with open('{d[0]}'.format(d=list_filepath), 'r') as csvinput, open('{d[1]}'.format(d=list_filepath), 'r') as csvinput2, open('d{[2]}'.format(d=list_filepath), 'r') as csvinput3, open('{d}'.format(d=file_out_path), 'w') as csvoutput:
            reader, reader2, reader3 = csv.reader(csvinput, csvinput2, csvinput3)                                               #1: Decision Forest, 2: Boosted Decision Tree, 3: ANN
            writer = csv.DictWriter(csvoutput, lineterminator='\n', fieldnames = ['oldRMSE', 'Decision Forest Regression RMSE', 'Boosted Decision Tree Regression RMSE', 'Neural Network Regression RMSE', 'Old Accurate Predictions', 'Old Inaccurate Predictions', 'Decision Forest Accurate Predictions', 'Decision Forest Inaccurate Predictions', 'Boosted Decision Tree Accurate Predictions', 'Boosted Decision Tree Inaccurate Predictions', 'Neural Network Accurate Predictions', 'Neural Network Inaccurate Predictions'])

            #######################################
            #For Decision Forest Predictions
            headerline = next(reader)
            emptyl=[]
            for row in reader:
                emptyl.append(row)

            #Calculate RMSE
            DecFSqResidSum = 0
            for row in emptyl:
                for cell in row:
                    if cell == row[-3]:
                        DecFSqResidSum = float(cell) + DecFSqResidSum
            DecFSqResidAvg = DecFSqResidSum / len(emptyl)
            DecForest_RMSE = np.sqrt(DecFSqResidAvg)

            #Constructing No. of Correct/Incorrect Predictions
            DecisionForest_Accurate = 0
            DecisionForest_Inaccurate = 0
            Old_Accurate = 0
            Old_Inaccurate = 0
            for row in emptyl:
                for cell in row:
                    if cell == row[-2] and 'Accurate' in cell:
                        Old_Accurate += 1
                    else:
                        Old_Inaccurate += 1
                    if cell == row[-1] and 'Accurate' in cell:
                        DecisionForest_Accurate += 1
                    else:
                        DecisionForest_Inaccurate += 1


            ######################################
            #For Boosted Decision Tree
            headerline2 = next(reader2)
            emptyl2=[]                                      #make new csv file(list) from csv reader
            for row in reader2:
                emptyl2.append(row)

            #Calculate RMSE
            OldSqResidSum = 0
            BoostDTSqResidSum = 0
            for row in emptyl2:                             #make Sum of Squared Residuals
                for cell in row:
                    if cell == row[-4]:
                        OldSqResidSum = float(cell) + OldSqResidSum
                    if cell == row[-3]:
                        BoostDTSqResidSum = float(cell) + BoostDTSqResidSum
            OldSqResidAvg = OldSqResidSum / len(emptyl2)    #divide by N to get average
            BoostDTResidAvg = BoostDTSqResidSum / len(emptyl2)
            oldRMSE = np.sqrt(OldSqResidAvg)               #calculate RMSE of ESTARRTIME & Boosted Decision Tree
            BoostedDecTree_RMSE = np.sqrt(BoostDTResidAvg)

            #Constructing Correct/Incorrect Predictions
            BoostedDT_Accurate = 0
            BoostedDT_Inaccurate = 0
            for row in emptyl2:
                    if cell == row[-1] and 'Accurate' in cell:
                        BoostedDT_Accurate += 1
                    else:
                        BoostedDT_Inaccurate += 1



            ######################################
            #For Artificial Neural Network (ANN) Predictions
            headerline3 = next(reader3)
            emptyl3=[]
            for row in reader3:
                emptyl3.append(row)

            #Calculate RMSE
            ANNSqResidSum = 0
            for row in emptyl3:
                for cell in row:
                    if cell == row[-3]:
                        ANNSqResidSum = float(cell) + ANNSqResidSum
            ANNSqResidAvg = ANNSqResidSum / len(emptyl3)
            ANN_RMSE = np.sqrt(ANNSqResidAvg)

            #Constructing Correct/Incorrect Predictions
            ANN_Accurate = 0
            ANN_Inaccurate = 0
            for row in emptyl3:
                for cell in row:
                    if cell == row[-1] and 'Accurate' in cell:
                        ANN_Accurate += 1
                    else:
                        ANN_Inaccurate += 1



            #Compile the Error Measures
            finalcsv = []
            finalcsv.append(oldRMSE)
            finalcsv.append(DecForest_RMSE)
            finalcsv.append(BoostedDecTree_RMSE)
            finalcsv.append(ANN_RMSE)
            finalcsv.append(Old_Accurate)
            finalcsv.append(Old_Inaccurate)
            finalcsv.append(DecisionForest_Accurate)
            finalcsv.append(DecisionForest_Inaccurate)
            finalcsv.append(BoostedDT_Accurate)
            finalcsv.append(BoostedDT_Inaccurate)
            finalcsv.append(ANN_Accurate)
            finalcsv.append(ANN_Inaccurate)



            #Write the Final Comparison file
            writer.writeheader()
            writer.writerows({'oldRMSE': row[0], 'Decision Forest Regression RMSE': row[1], 'Boosted Decision Tree Regression RMSE': row[2], 'Neural Network Regression RMSE': row[3], 'Old Accurate Predictions': row[4], 'Old Inaccurate Predictions': row[5], 'Decision Forest Accurate Predictions': row[6], 'Decision Forest Inaccurate Predictions': row[7], 'Boosted Decision Tree Accurate Predictions': row[8], 'Boosted Decision Tree Inaccurate Predictions': row[9], 'Neural Network Accurate Predictions': row[10], 'Neural Network Inaccurate Predictions': row[11]} for row in np.nditer(finalcsv))


main()
python function class instance
3个回答
0
投票

通过调用def init(self,no_of_files)创建Calculate_RMSE_Assess_Models实例时,应该给出no_of_files参数。


0
投票

你需要将self添加到number_of_files()out_path()open_read_write_file()的签名中:

class Calculate_RMSE_Assess_Models:

   def __init__(self, no_of_files):
       self.no_of_files = no_of_files

   def number_of_files():
      numfiles = input("Enter the number of files to iterate through: ")
      numfilesnumber = int(numfiles)
      return numfilesnumber

   def pathlist(self):
      filepathlist = []
      while self.no_of_files > 0:             #self.number_of_files
          path = input("Enter the filepath of the input file: ")
          filepathlist.append(path)
          no_of_files = no_of_files - 1
      return filepathlist

    def out_path(self):
      path = input("Enter the file path of output path: ")
      return path


    def open_read_write_files(self):
       pass

但是,如果您希望保留类中函数的属性,可以使用classmethod装饰器:

class Calculate_RMSE_Assess_Models:

   def __init__(self, no_of_files):
       self.no_of_files = no_of_files
   @classmethod
   def number_of_files(cls):
      numfiles = input("Enter the number of files to iterate through: ")
      numfilesnumber = int(numfiles)
      return numfilesnumber

   def pathlist(self):
      filepathlist = []
      while self.no_of_files > 0:             #self.number_of_files
          path = input("Enter the filepath of the input file: ")
          filepathlist.append(path)
          no_of_files = no_of_files - 1
      return filepathlist
    @classmethod
    def out_path(cls):
      path = input("Enter the file path of output path: ")
      return path

    @classmethod
    def open_read_write_files(cls):
       pass

0
投票

在您的班级定义中,您有list_filepath = pathlist(no_of_files)。这称pathlistno_of_filesselfno_of_files是一个int,所以while self.no_of_files > 0:试图访问no_of_filesint属性。

完整的Traceback显示了这一点。在查看这样的问题时发布完整的Traceback很有帮助。

Traceback (most recent call last):
  File "redacted", line 17, in <module>
    class Calculate_RMSE_Assess_Models:
  File "redacted", line 38, in Calculate_RMSE_Assess_Models
    list_filepath = pathlist(no_of_files)
  File "redacted", line 32, in pathlist
    while self.no_of_files > 0:             #self.number_of_files
AttributeError: 'int' object has no attribute 'no_of_files'
© www.soinside.com 2019 - 2024. All rights reserved.