Как я могу получить доступ к атрибутам в экземплярах классов, содержащихся в экземпляре другого класса? - PullRequest
0 голосов
/ 17 января 2020

Я создаю фондовый скрининг с Python. Мои данные выглядят так. Из-за формата данных я пытаюсь использовать вложенные классы (я думаю, это то, что я делаю), чтобы иметь возможность ссылаться на данные. Изображение данных

Вот код для моих классов:

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'

Может кто-нибудь сказать мне, что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Ваша ошибка, так как нечего делать с вложенным классом. Проблема в вашей функции инициализации в class FieldClass.

Вы устанавливаете атрибуты вашего класса на условия, поэтому, если условие не выполняется, ваш класс не будет иметь этого атрибута.

В этом случае это opincome атрибут

Вот ваши варианты:

  • установить атрибуты по умолчанию
  • удалить эти условия
  • изменить ваш код таким образом, чтобы FieldClass загружал все необходимые атрибуты (цена, оборот, opincome, ...). Я рекомендую вам эту опцию
0 голосов
/ 17 января 2020

У вас не установлены значения по умолчанию для ваших атрибутов, и они будут установлены только в том случае, если будет выполнено правильное условие - как таковое, может ли быть так, что ваши входные данные не имеют набора OperatingIncome, и, следовательно, ваш класс не имея этот атрибут установленным / созданным для существования?

...