2015-10-02 2 views
2

У меня есть класс CityИмея два ключа для каждого значения в словаре

class City(object): 

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

Тогда я положил его в словарь:

c = City('NYC') 
cities = dict() 
cities[c] = 1 

я могу получить доступ к стоимости NYC с cities[c]. Могу ли я сделать то же самое с cities['NYC']? В принципе, я хочу, чтобы экземпляр City и переменная экземпляра City.name ссылались на тот же ключ.

Я думал о том, что у меня есть отдельный словарь names = {'NYC': c}, так что я мог бы сделать cities[names['NYC']]. Есть ли лучшие способы? В идеале мне не нужно будет использовать отдельные переменные и нужно будет только модифицировать внутренние слова либо City, либо словарь cities.

+0

Что вы не используете 'cities [c.name]'? – Kasramvd

+0

@ Kasramvd Я помещу больше переменных экземпляра внутри класса 'City', поэтому я хочу сохранить сам объект. – onepiece

ответ

3

Вы можете реализовать это __hash__ метод, где есть имя атрибута и __eq__, сравнивающий равенства на основе имени атрибута:

class City(object): 
    def __init__(self, name): 
     self.name = name 

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

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

Выход:

In [8]: c = City('NYC') 

In [9]: cities = dict() 

In [10]: cities[c] = 1 

In [11]: cities[c] 
Out[11]: 1 

In [12]: cities[c.name] 
Out[12]: 1 

экземпляры хеш-значение является основанный на его атрибуте name, поэтому поиск с использованием объекта или атрибута с экземпляром instance.name будет иметь значение hash с тем же значением.

+0

Спасибо! Я попробовал переопределить '__hash__', но забыл сделать то же самое для' __eq__', забыл, что мне нужны оба. – onepiece

+0

@onepiece, без проблем, ваш прием. –