【问题标题】:TypeError: __init__() missing 1 required positional argument in subclassTypeError:__init__() 在子类中缺少 1 个必需的位置参数
【发布时间】:2016-05-13 12:41:58
【问题描述】:

我在嵌套表中有值。我需要做一些计算并得到结果。课程组织在script1.pyscript2.py

有超类Values,它读取列表中的每一行并将它们转换为numpy数组。

还有子类Dimensions,它从Values继承数组并进行计算。

代码对表格进行操作并获得结果,但不起作用。我收到错误消息:

init() 缺少 1 个必需的位置参数:'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)

【问题讨论】:

  • 好吧,当您调用Dimensions() 时,您并没有传入参数,但Dimensions.__init__() 显然需要tbl 参数。您的意思是改为拨打Dimensions(table) 吗?
  • 你为什么要在script2.py 的模块级别创建val?它不仅不需要(您调用的每个方法都已被Dimensions 继承),它还确保您创建的每个Dimensions 对象都会污染其他所有Dimensions 对象的数据。
  • 想一想......这两个类如何帮助你做任何事情,除了减慢你已经创建的numpy数组(一遍又一遍......)?您是否尝试反映这些类之外的某些代码对 table 所做的更改?
  • 谢谢。首先我要说的是我不是程序员,我是结构(土木)工程师,我的编程学习方法主要是反复试验和上网。
  • 这个想法就是我在这里所说的“表格”,实际上是一个 csv 文件,其中包含所有符合美国、欧洲等标准的钢截面。此文件包含每个部分的几何特征和其他基本特征。

标签: python class scoping


【解决方案1】:

您的代码中有这些实例化尝试:

val = Values()
dim = Dimensions()

您需要将相关参数传递给它们以进行实例化,因为在您实例化时会隐式调用 __init__ 方法,并且它在两种情况下都需要一个参数。

【讨论】:

  • 好的,但由于参数位于不同的脚本中,我该怎么做?
  • @PedroBiel:根据您发布的代码,它们在 same 文件 (script3.py) 中,因此您可以将参数传递给 @ 987654324@ 初始化器,就像你将它传递给任何其他可调用对象一样。
  • 如果我写在 script3 dim = Dimensions(table) 我会得到同样的错误信息。如果我另外写 script2 val = Values(table) 我会收到以下错误消息:NameError: name ‘table’ is not defined
【解决方案2】:

Idos已经说明了失败的原因,我不再赘述。查看您的代码,我猜测您需要在表格中传递:

# script3.py
dim = Dimensions(table)

script2.py中,我不知道你为什么要在那里创建一个Values 对象,我也不知道该猜什么。

【讨论】:

  • 请看我对 Kevin J. Chase 的回答。
【解决方案3】:

阅读您的答案,我遵循了传递论点的线索。我也意识到我的示例代码太简单了,无法理解我的问题。 我正在寻找的是:

  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]

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2021-06-05
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多