#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()