#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)