Python, инициализировать атрибут класса в цикле

1

Как инициализировать атрибуты экземпляра класса в цикле? Ниже приведен пример того, что я хочу сделать. Представьте себе класс с двадцатью-тридцатью атрибутами. Должен быть эффективный способ установки значений. Нужно ли мне менять атрибуты класса в словаре для этого? Но это будет проблемой, так как я работаю с картой Django, чтобы создать таблицу с классом в этом примере. Заранее спасибо!

class Foo():
    fieldA = float()
    fieldB = float()
    fieldC = float()
    fieldD = float()
    fieldE = float()
    fieldF = float()
    # several more field elements


def main():
    foo_instance = Foo()

    # open here excel file with openpyxl library
    wb = openpyxl.load_workbook(BASE_DIR + file, read_only=True, data_only=True)
    ws = wb['sheet1']


    # I would like to iterate through the instance 
    for i in range(1,20):
        foo.fieldA = float(ws['A{}'.format(i)]) #how to iterate through the attributes from foo instance?

    '''
        This is the inefficient way:
        foo.fieldA = float(ws['A1'])
        foo.fieldB = float(ws['A2'])
        foo.fieldC = float(ws['A3'])
        foo.fieldD = float(ws['A4'])
        foo.fieldE = float(ws['A5'])
        etc.
    '''

if __name__ == "__main__":
    main()
Теги:
class
loops
instance

1 ответ

0

Попробуйте помещать переменные в список и итерации через них.

my_list = [fieldA, fieldB] # and so on...

# Set an index
index = 0

# Iterate
for field in my_list:
    field = float(ws['A{}'.format(index)])
    index += 1 # Increment index each time

Вы даже можете удалить имена переменных и просто использовать индексы списка, такие как my_list[0], my_list[1] т.д., Но это будет зависеть от того, что вам нужно.

  • 0
    fieldA, fieldB - это атрибуты класса. И я также не могу сгенерировать список внутри класса, так как это не создаст таблицы в структуре Django. Я чувствую, что должен создать функцию внутри класса, чтобы сделать атрибуты повторяемыми. Нет ли лучшего способа?
  • 0
    Я мог бы получить атрибуты класса в списке, но я не знаю, как получить к нему доступ: members = [attr для attr в dir (foo), если он не вызывается (getattr (foo, attr)), а не attr.startswith ('__ «)]
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню