Как лучше создать dict-like класс с составным ключом? Задача в следующем: 1) имеется класс, имеющий 4 свойства, 2 из которых "только для чтения" 2) нужно создать второй класс (в каком-то роде dict-like), состоящий из последовательности экземпляров первого класса и в котором должен использоваться составной ключ из вышеупомянутых двух readonly-свойствКак сделать это лучше? Надеюсь, объяснил более или менее понятно Пробовал сделать, реализовав для первого класса методы __eq__ и __hash__, а во втором хранил экземпляры первого класса во множестве. Примерно так: gist. Но мне не особо это нравится: создание множества, конечно, происходит по "составному ключу", но получить значение по этому ключу нельзя Смотрел библиотеку collections, но тоже не высмотрел подходящее
Для создания dict-like класса с составным ключом, можно воспользоваться структурой данных defaultdict из модуля collections. В данном случае можно использовать кортеж из значений двух readonly-свойств первого класса в качестве ключа для defaultdict.
В данном примере, DictLikeClass содержит defaultdict, где ключом является кортеж из значений prop1 и prop2 объекта FirstClass, а значением - сам объект FirstClass. Методы add_instance и get_instance позволяют добавлять и извлекать объекты по составному ключу.
Для создания dict-like класса с составным ключом, можно воспользоваться структурой данных defaultdict из модуля collections. В данном случае можно использовать кортеж из значений двух readonly-свойств первого класса в качестве ключа для defaultdict.
Пример реализации:
from collections import defaultdictclass 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 позволяют добавлять и извлекать объекты по составному ключу.