Есть ли способ сделать ключи класса итеративными?

#python #class

Вопрос:

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

Мой класс:

 def MyClass():
  def __init(self):
    self.default_prop1 = ''
    self.default_prop2 = ''
 

Мой основной файл:

 def main():
  keys = ['default_prop1', 'default_prop2', 'not_default_prop1', 'not_default_prop2' ]

  obj_myclass = MyClass()

  for i in keys:
    #Here
    obj_myclass[i] = file.readline()
 

Есть ли способ сделать что-то подобное?

Комментарии:

1. В общем, если вам нужно что-то подобное, у вас должен быть только один атрибут, содержащий список или словарь.

2. Вы можете использовать getattr() для динамического доступа к атрибутам. Это то, что ты ищешь?

3. @Barmar, я думал о getattr, но мне нужно «создать» пользовательские атрибуты для класса, getattr позволяет мне просматривать данные только в динамическом режиме. Я также думал о словаре, но у этого решения есть свои проблемы. Класс, у которого есть только словарь, немного странный (на данный момент я могу использовать массив словарей вместо массива классов для представления набора данных). Но из того, что я обнаружил, я думаю, что это правильный путь.

4. setattr() позволяет вам создавать их.

Ответ №1:

Я немного обновлю ваш класс:

 def Car(): #an example of a car class
  def __init(self, props):
    self.props = ({}, {})
 

Теперь вы можете перебирать свойства по умолчанию и дополнительные:

 def main() 
  new_car = Car(({"year": 1998}, {"sports_car_type": "countach"}))
  # Now, you can go through the keys in both dictionaries of this new object
  print("defaults:")
  for key, val in new_car.props[0].items():
    print(key, val)
  print("~~~~~~~~~extras:")
  for key, val in new_car.props[1].items():
    print(key, val)

main()
 

Ответ №2:

Вы можете использовать этот vars() механизм. Исправлены две опечатки в вашем примере кода, чтобы дать

 class MyClass():                           # not def
      def __init__(self):                  # not __init
        self.default_prop1 = ''
        self.default_prop2 = ''
 

вы можете сделать

 >>> mc = MyClass()
>>> vars(mc)
{'default_prop1': '', 'default_prop2': ''}
 

Возвращаемый объект vars() является правильным dict (он возвращает __dict__ атрибут) и может быть обновлен так, как вы хотите.

 >>> vars(mc)["new_prop"] = "Fred"
>>> mc.new_prop
'Fred'
 

Или, если вы хотите сделать это в цикле:

 >>> for i in (v := vars(mc)):
        v[i] = file.readline()