Python, использующий объект в качестве ключа словаря?

#python #python-3.x #oop

Вопрос:

В Python существует ли метод использования ссылки на объект в качестве ключа к словарю?

Допустим, у меня есть следующий класс:

 class Example:  def __init__(self, id):  self.id = id  def __hash__(self):  return hash(self.id)  def __eq__(self, other):  if self.id == other.id:  return True  return False  

Затем, если я создам экземпляр своего класса:

 object = Example("My object")  

Есть ли в Python какой-либо способ использовать объект object в качестве ключа к словарю БЕЗ определения методов __hash__ и __eq__ ?

В нынешнем виде, если я это сделаю:

 instances = {object: 1}  

позже я решу, что хочу изменить идентификатор object

 object.id = "Not my object"  

Я хочу, чтобы словарь «знал», что я изменил идентификатор, чего не произойдет с этой реализацией, потому что ключ не является ссылкой на сам объект. Есть ли какой-нибудь способ обойти это в Python?

Спасибо!

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

1. Нет, я не думаю, что есть способ сделать это. Из любопытства, почему вы хотите сделать такую вещь?

2. Что делать, если вы просто не определяете методы __hash__ и __eq__ ?

3. @mkrieger1 Это приведет к тому, что идентификация объекта станет основой для равенства и хэширования, что может быть уместно

4. Вы действительно хотите избежать изменения объектов, используемых в качестве ключей, где это возможно. Как минимум, вам необходимо убедиться, что поля, которые изменяются, не используются в реализациях __hash__ и __eq__ , иначе у вас возникнут некоторые действительно запутанные ошибки

5. Лучше не называть что-то object , так как встроенный object является основой для всего в Python.

Ответ №1:

Почему бы просто не добавить метод для изменения имени ключа на диктант? Например:

 class Example(dict):  def change(self, name, new_name):  self[new_name] = self.pop(name)  return self  x = Example({'hi':'Hello'}) print(x) x.change('hi','hello') print(x)