【问题标题】:How can I access attributes in class instances held inside an instance of another class?如何访问保存在另一个类的实例中的类实例中的属性?
【发布时间】:2020-01-16 23:56:04
【问题描述】:

我正在使用 Python 创建一个股票筛选器。我的数据看起来像这样。由于数据的格式,我正在尝试使用嵌套类(我认为这就是我正在做的)来引用数据。 Data Image

这是我的课程的代码:

class FieldClass:
    def __init__(self, parts):
        if parts[2].replace(" ", "") == 'Price':
            self.price = YearClass(parts)
        elif parts[2].replace(" ", "") == 'Revenues':
            self.rev = YearClass(parts)
        elif parts[2].replace(" ", "") == 'OperatingIncome':
            self.opincome = YearClass(parts)
        elif parts[2].replace(" ", "") == 'OperatingMargin':
            self.opmargin = YearClass(parts)
        elif parts[2].replace(" ", "") == 'NetProfitMargin':
            self.profitmargin = YearClass(parts)

class YearClass:
    # creates a class whose objects/attributes are a dict of each year of data
    def __init__(self, parts):
        self.years_data = dict()
        self.years_data[2009] = (parts[3])
        self.years_data[2010] = (parts[4])
        self.years_data[2011] = (parts[5])
        self.years_data[2012] = (parts[6])
        self.years_data[2013] = (parts[7])
        self.years_data[2014] = (parts[8])
        self.years_data[2015] = (parts[9])
        self.years_data[2016] = (parts[10])
        self.years_data[2017] = (parts[11])
        self.years_data[2018] = (parts[12])
        self.years_data[2019] = (parts[13])

这是我在代码中调用/引用类的方式:

def data_prep(fname):
    tkr_list = []
    data_dict = dict()

with open(fname) as f_in:
    f_in.readline()
    for lines in f_in:
        parts = lines.strip('\n').split(",")
        tkr = parts[1]
        key_cat = parts[2].replace(" ", "")

        if tkr not in tkr_list:
            tkr_list.append(tkr)

    for tkr in tkr_list:
        data_dict[tkr] = FieldClass(parts)

var = data_dict['FLWS'].opincome.years_data[2010]

这是我得到的错误:

AttributeError: 'FieldClass' object has no attribute 'opincome'

谁能告诉我我做错了什么?

【问题讨论】:

  • 您的FieldClass 实例不会有opincom 属性,除非此语句为真:parts[2].replace(" ", "") == 'OperatingIncome'。因此,似乎该陈述永远不会正确。这应该很容易调试:您是否验证了 parts[2].replace(" ", "") 是您认为的那样?
  • FWIW,你的类没有嵌套。其中一个只包含另一个的实例。 “嵌套”将定义一个 inside 另一个,这在 Python 中并不经常使用。

标签: python class inner-classes attributeerror


【解决方案1】:

您没有为属性设置默认值,只有在满足正确条件时才会设置它们 - 因此,可能是您的输入数据没有设置 OperatingIncome,因此您的类不是设置/使该属性存在?

【讨论】:

    【解决方案2】:

    您的错误与嵌套类无关。 问题出在class FieldClass 中的init 函数

    您正在根据条件设置类属性,因此如果不满足条件,您的类将没有此属性。

    在这种情况下,它是opincome 属性

    这是您的选择:

    • 设置默认属性
    • 删除这些条件
    • 以 FieldClass 加载所有必要属性的方式更改您的代码(价格、转速、营业收入等)。 我向你推荐这个选项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      相关资源
      最近更新 更多