2016-05-13 66 views
0

我在嵌套表中有值。我需要做一些計算並獲得結果。課程安排在script1.pyscript2.pyTypeError:__init __()在子類中缺少1個必需的位置參數

存在超類Values,它讀取列表中的每一行並將它們轉換爲numpy數組。

還有一個子類Dimensions,它繼承Values的數組並進行計算。

該代碼與表一起運行並獲取結果,但不起作用。我得到的錯誤信息:

init() missing 1 required positional argument: 'tbl'

script1.py

import numpy as np 

class Values: 
    def __init__(self, tbl): 
     self.tbl = tbl 

    def get_val_a(self): 
     val_a = np.array(self.tbl[0]) 
     return val_a 

    def get_val_b(self): 
     val_b = np.array(self.tbl[1]) 
     return val_b 

    def get_val_c(self): 
     val_c = np.array(self.tbl[2]) 
     return val_c 

script2.py

from script1 import Values 

val = Values() 

class Dimensions(Values): 

    def __init__(self, tbl): 
     super().__init__(tbl) 

    def get_dim_a(self): 
     dim_a = 2 * val.get_val_a() 
     return dim_a 

    def get_dim_b(self): 
     dim_b = 2 * val.get_val_b() 
     return dim_b 

    def get_dim_c(self): 
     dim_c = 2 * val.get_val_c() 
     return dim_c 

script3.py

from script2 import Dimensions 

table = [[1, 2, 3], 
     [1, 4, 9], 
     [1, 8, 27]] 

dim = Dimensions() 

dim_1 = dim.get_dim_a() 
dim_2 = dim.get_dim_b() 
dim_3 = dim.get_dim_c() 
print('Dimensions: ', dim_1, dim_2, dim_3) 
+1

好吧,你是不是在傳遞一個參數,當你調用'尺寸()''但尺寸。__init __()'顯然需要'tbl'參數。你是不是要調用'Dimensions(table)'而不是? –

+0

爲什麼你要在'script2.py'的模塊級創建'val'呢?它不僅不需要(每個調用它的方法都已經由'Dimensions'繼承),它確保每個創建的Dimensions對象都會污染每個其他'Dimensions'對象的數據。 –

+0

來想一想...這兩個類如何幫助你做任何事情,但減慢你已經創建的numpy數組(反覆和...)?你是否試圖通過這些類之外的代碼來反映對'table'所做的更改? –

回答

2

你甲肝Ë這些實例嘗試在你的代碼:

val = Values() 
dim = Dimensions() 

您需要將相關參數傳遞給他們,以實例化,因爲當隱式實例化__init__方法被調用,並預計在這兩種情況下的參數。

+0

好吧,但我怎麼做,因爲參數是在一個不同的腳本? –

+0

@PedroBiel:根據您發佈的代碼,它們位於_same_文件('script3.py')中,所以您可以按照傳遞它的方式將參數傳遞給'Dimensions'初始化器到任何其他可調用的。 –

+0

如果我在script3中寫入 'dim = Dimensions(table)' 我收到相同的錯誤消息。 如果我另外寫腳本 'val = Values(table)' 我收到以下錯誤消息: 'NameError:name'table'is not defined' –

0

Idos已經說明失敗的原因,我不會重複。看你的代碼,我,你需要在表格中傳遞:

# script3.py 
dim = Dimensions(table) 

script2.py,我不知道你爲什麼要創建一個Values對象那裏,我不知道該猜測什麼。

+0

請查看我對凱文J.蔡斯的回答。 –

0

閱讀你的答案,我遵循了通過論證的線索。我也意識到我的示例代碼太簡單,無法理解我的問題。 我在尋找的是:

  1. 閱讀任何尺寸的任何csv文件。這些csv文件應該包含有關鋼部件的信息,並且可能互不相同。
  2. 將csv文件的列值賦給我可以操作的數組。
  3. 根據項目使用不同的標準進行基本計算。
  4. 使用基本計算來解決項目的特定問題。對於每個問題,該腳本可能會有所不同。其他具有班級的人員將被保存以重新使用。

到目前爲止,這是我最好的解決辦法:

# csv file: table.csv 
# ------------------- 

#a,b,c 
1,2,3 
1,4,9 
1,8,27 

# script1 
# ------- 

import numpy as np 
import csv 

class ImportFileCSV: 
    ''' 
    Read any csv file and transpose the rows to columns. 
    There are different csv files with different dimensions. 
    ''' 

    def __init__(self, file_csv): 
     self.table_csv = [] 
     self.file_csv = file_csv 

    def read_table_csv(self): 
     with open(self.file_csv, newline = '') as f_csv: 
      reader = csv.reader(f_csv) 
      for row in reader: 
       if row[0].startswith('#'): continue # Ignore the header. 
       self.table_csv.append(row)  
     self.table_arr = np.array(self.table_csv) 
     return self.table_arr.T  

class Values(ImportFileCSV): 
    ''' 
    Assign the values of each column to an array. 
    There would be different classes Values1, Values2... for each csv file. 
    ''' 

    def __init__(self, file_csv): 
     super().__init__(file_csv) 
     import_file_csv = ImportFileCSV(self.file_csv) 
     self.table = import_file_csv.read_table_csv() 

    def get_val_a(self): 
     val_a = np.array(self.table[0], dtype = int) 
     return val_a 

    def get_val_b(self): 
     val_b = np.array(self.table[1], dtype = int) 
     return val_b 

    def get_val_c(self): 
     val_c = np.array(self.table[2], dtype = int) 
     return val_c 

# script2 
# ------- 

from script1 import Values 

class Dimensions(Values): 
    ''' 
    Do some basic calculations according to specific standards. 
    For each standard there would be different classes Dimensions1, Dimension2... 
    ''' 

    def __init__(self, file_csv): 
     super().__init__(file_csv) 
     self.val = Values(self.file_csv) 

    def get_dim_a(self): 
     dim_a = self.val.get_val_a() + 2 
     return dim_a 

    def get_dim_b(self): 
     dim_b = self.val.get_val_b() * 2 
     return dim_b 

    def get_dim_c(self): 
     dim_c = self.val.get_val_c() ** 2 
     return dim_c 

# script 3 
# -------- 

# PROJECT 

from script2 import Dimensions 

dim = Dimensions('table.csv') 

dim_a = dim.get_dim_a() 
dim_b = dim.get_dim_b() 
dim_c = dim.get_dim_c() 

solution = dim_c - dim_a - dim_b 

print('Dimensions:', dim_a, dim_b, dim_c) 
print('Solution :', solution) 

# Results 
# ------- 

Dimensions: [3 3 3] [ 4 8 16] [ 9 81 729] 
Solution : [ 2 70 710] 
相關問題