Как лучше создать dict-like класс с составным ключом? Задача в следующем:
1) имеется класс, имеющий 4 свойства, 2 из которых "только для чтения"
2) нужно создать второй класс (в каком-то роде dict-like), состоящий из последовательности экземпляров первого класса и в котором должен использоваться составной ключ из вышеупомянутых двух readonly-свойствКак сделать это лучше?
Надеюсь, объяснил более или менее понятно
Пробовал сделать, реализовав для первого класса методы __eq__ и __hash__, а во втором хранил экземпляры первого класса во множестве. Примерно так: gist. Но мне не особо это нравится: создание множества, конечно, происходит по "составному ключу", но получить значение по этому ключу нельзя
Смотрел библиотеку collections, но тоже не высмотрел подходящее

21 Авг 2019 в 07:02
152 +1
0
Ответы
1

Для создания dict-like класса с составным ключом, можно воспользоваться структурой данных defaultdict из модуля collections. В данном случае можно использовать кортеж из значений двух readonly-свойств первого класса в качестве ключа для defaultdict.

Пример реализации:

from collections import defaultdict
class FirstClass:
def __init__(self, prop1, prop2, prop3, prop4):
self.prop1 = prop1
self.prop2 = prop2
self._prop3 = prop3
self._prop4 = prop4
class DictLikeClass:
def __init__(self):
self.data = defaultdict(dict)
def add_instance(self, instance):
key = (instance.prop1, instance.prop2)
self.data[key] = instance
def get_instance(self, prop1, prop2):
key = (prop1, prop2)
return self.data.get(key)
# Пример использования
dict_like = DictLikeClass()
instance1 = FirstClass('a', 'b', 'c', 'd')
instance2 = FirstClass('x', 'y', 'z', 'w')
dict_like.add_instance(instance1)
dict_like.add_instance(instance2)
retrieved_instance = dict_like.get_instance('a', 'b')
print(retrieved_instance.prop1, retrieved_instance.prop2, retrieved_instance._prop3, retrieved_instance._prop4)

В данном примере, DictLikeClass содержит defaultdict, где ключом является кортеж из значений prop1 и prop2 объекта FirstClass, а значением - сам объект FirstClass. Методы add_instance и get_instance позволяют добавлять и извлекать объекты по составному ключу.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 436 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир