【问题标题】:Python: Define Object within a ClassPython:在类中定义对象
【发布时间】:2017-03-03 08:53:33
【问题描述】:

对 Python 非常陌生,需要一些帮助。如何在课堂上引用成员? 我有两个 csv 文件。一个包含一系列零件和相关的材料 ID。另一个是包含材料 ID 和有关该材料的一些信息的材料索引。

我的目的是创建第三个文件,其中包含所有零件、它们的材料 ID 以及材料索引中存在的信息。

我为材料索引创建了一个类,并尝试使用零件文件中的材料 ID 访问此类中的对象,但是,这不起作用,我不确定为什么。任何帮助表示赞赏:

class material():
    def __init__(self, name, ftu, e, nu):
        self.name = name
        self.ftu = ftu
        self.e = e
        self.nu = nu

def extract_FTU_Strain(input_file_parts,input_file_FTU,output_file):

    parts = {}
    materials = {}

    for aline in open(input_file_FTU, 'r'):
        comma_split = aline.strip().split(',')
        name = comma_split[1]
        ftu = comma_split[8]
        e = comma_split[9]
        nu = comma_split[7]



        try:
            materials[int(comma_split[0])] = material(comma_split[1],comma_split[8],comma_split[9],comma_split[7])
            #materials[comma_split[0]] = material(comma_split[1],comma_split[8],comma_split[9],comma_split[7])
        except:
            pass


    for i in open(input_file_parts, 'r'):
        semicolon_split = i.strip().split(';')


        material_id = semicolon_split[3]


        part = semicolon_split[0]
        part_id = semicolon_split[1]

        material_name = materials[material_id].name
        FTU = materials[material_id].ftu
        Stress = materials[material_id].e
        output.write(','.join([part,part_id,material_name,material_id,FTU,Stress]) + '\n') 












    output = open (output_file,'w')
    output.write('Part Title, Part Id, Material Id, FTU, e' + '\n')
    output.close()

import sys

input_file_parts = '/parttable.csv'
input_file_FTU = '/Material_Index.csv'
output_file = '/PYTHONTESTING123.csv'
extract_FTU_Strain(input_file_parts,input_file_FTU,output_file)

【问题讨论】:

  • 究竟是什么不起作用?请将您的代码减少到演示问题所需的最低限度。至少,在发布之前删除注释掉的行。
  • 所以我相信我已经成功创建了这个类,但是在尝试从类中提取信息时出现错误: line: material_name = materials[material_id].name 我认为这是因为 material_id 来自零件列表文件并且类已经从材料索引生成。
  • 什么错误
  • 很抱歉,这会有所帮助!关键错误:“材料 ID”。这是semicolon_split[3] 的第一个实例。我认为这个问题可能是由于试图比较一个字符串和一个整数,因为我刚刚意识到 material_id 是一个字符串,但 [int(comma_split[0]]) 显然必须是一个整数
  • 没有。 materials 是一个字典,它的键是整数,值是类实例。但是您看到的错误是在字典中查找元素,而不是在获得实例后访问实例中的信息。

标签: python class object keyerror


【解决方案1】:

因为您在 cmets 中说您的错误在于 materials[material_id] 使 material_id 成为整数,因为它在您创建对象时是整数。

你是这样创建的

materials[int(comma_split[0])]=...

但后来在没有将 material_id 转换为 int 的情况下调用它。在你的 for 循环中调用它以写入输出之前执行此操作。

material_id = int(material_id)

【讨论】:

    【解决方案2】:

    我可能曲解了您的问题,但脱口而出“我如何在课堂上引用成员?”你可以像这样引用成员变量:

    class Demonstration:
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
        def printMembers(self):
            print self.a, self.b
    

    所以在类内部你可以使用self.someVariable 来引用成员变量。

    如果你想在课堂之外访问它们:

    myclass.myvariable
    

    如果我不太理解您的问题或者您遇到特定错误,我会很乐意编辑答案。

    【讨论】:

      【解决方案3】:

      我不明白你有什么错误,你能把回溯吗?无论如何,您正在分配时创建一个类实例。要获得更优雅的编程,您可以简单地执行以下操作:

      m = materials(name, ftu, e, nu)

      这样你可以像这样访问实例变量:

      m.name
      m.ftu
      ...
      

      然后尝试,除了 -> 很危险

      【讨论】:

      • 所以我想我的问题是如何使用 m.name 语法指定你想要的类中的哪个名称。这肯定可以引用任何实例,因为类中的每个成员都有一个关联的名称 ftu、u 和 nu?
      • 没错。创建类实例时,您可以使用 var.name 访问变量和方法。在 python 中,没有 java 或其他语言中定义的私有可见性。默认情况下,可见性是公开的
      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 2013-09-09
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 2019-03-16
      相关资源
      最近更新 更多