Python: Как получить значение в словаре по ключу, если ключ словаря является объектом класса?

#python #dictionary #oop #&raph #python-class

#python #словарь #ооп #График #python-class

Вопрос:

Здесь новичок, и мне было интересно, возможно ли это, или это вообще правильный подход к проблеме.

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

Я подумал, что лучшим способом представления узлов графа и отношений было бы иметь словарь наборов, где ключи словаря являются узлами, а его значения представляют дуги направлений (key1 -&&t; key1value1, key1 -&&t; key1value2).

Итак, у меня есть простой класс под названием Person:

 class Person:
    def __init__(self, name):
        self.name = name

    def __eq__(self, other):
        return (self.name, ) == (other.name, )

    def __hash__(self):
        return hash((self.name,))

    def __repr__(self):
        return self.name
  

Затем у меня есть словарь, в котором и ключ, и значения являются объектами класса:

 classdict = {}
classdict[Person("James")] = {Person("Maria")}
classdict[Person("James")].add(Person("Bonita"))
  

Хорошо, пока все хорошо. Когда я выполняю print(classdict) , ответ:

 {James: {Maria, Bonita}}
  

И быстрая проверка типа показывает, что все они являются объектами класса:

 for k, v in classdict.items():
    print(type(k))
    print(type(list(v)[0]))
    print(type(list(v)[1]))
  

С принтами:

 <class '__main__.Person'&&t;
<class '__main__.Person'&&t;
<class '__main__.Person'&&t;
  

Но теперь я не понимаю, как мне с этим работать?
Например, я хотел бы получить доступ к значениям словаря по ключу, где указан атрибут name James . Как бы мне это сделать? Глупый я, я попробовал, print(classdict["James"]) что, очевидно, не сработало, и выдает мне KeyError .

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

1. Чтобы получить доступ к значениям словаря, где имя Джеймс, вам придется искать хэшированный объект Person(«Джеймс»), поэтому print(classdict[Person(«Джеймс»)]) выдаст вам значения {Bonita, Maria}

2. @bp7070 Ладно, это была до смешного простая вещь, которую я упустил из виду. И да, это работает! Спасибо!

3. Я не тестирую, но думаю, что если вы определяете __has__ как: return hash(self.name) , то classdict["James"] это сработает.