Я работаю с pymongo и хочу убедиться, что сохраненные данные могут быть загружены, даже если в схему были добавлены дополнительные элементы данных.
Я использовал это для классов, которым не нужно обрабатывать информацию перед присвоением ее атрибутам класса:
class MyClass(object):
def __init__(self, instance_id):
#set default values
self.database_id = instance_id
self.myvar = 0
#load values from database
self.__load()
def __load(self):
data_dict = Collection.find_one({"_id":self.database_id})
for key, attribute in data_dict.items():
self.__setattr__(key,attribute)
Однако в классах, из которых мне нужно обрабатывать данныебаза данных, это не работает:
class Example(object):
def __init__(self, name):
self.name = name
self.database_id = None
self.member_dict = {}
self.load()
def load(self):
data_dict = Collection.find_one({"name":self.name})
self.database_id = data_dict["_id"]
for element in data_dict["element_list"]:
self.process_element(element)
for member_name, member_info in data_dict["member_class_dict"].items():
self.member_dict[member_name] = MemberClass(member_info)
def process_element(self, element):
print("Do Stuff")
Два примера использования, которые у меня есть:
1) Список строк, которые используются для установки флагов, это делается путем вызова функциисо строкой в качестве аргумента.(def process_element
выше)
2) Словарь словарей, которые используются для создания списка экземпляров класса.(MemberClass(member_info)
выше)
Я пытался создать свойства, чтобы справиться с этим, но обнаружил, что __setattr__
не ищет свойства.
Я знаю, что мог бы переопределить __setattr__
, чтобы искать конкретныеимен, но я понимаю, что это замедлит все взаимодействия между множествами с классом, и я предпочел бы избежать этого.
Я также знаю, что мог бы использовать кучу попыток / исключений для отлова ошибок, но этоВ конечном итоге код становится очень громоздким.
Я не возражаю против того, чтобы функция загрузки немного замедлилась, но очень хочу избежать всего, что замедлит класс вне загрузки.