2012-02-29 4 views
3

Я собираюсь написать функцию, которая найдет правильный обработчик для класса. Для этого я хочу использовать сопоставление классов от обработчиков. Я уже проверял, что можно использовать классы как словарные ключи, однако я не совсем уверен, правильно ли это делать.Можно ли использовать классы в качестве словарных ключей в python?

Моя основная забота заключается в том, что если у меня есть класс, импортированный в два разных модуля, эти два будут иметь одинаковый хэш. Но, возможно, есть некоторые другие аспекты, которые я должен рассмотреть.

Если идея использования самих классов неверна, я буду использовать классные имена, но это потребует от меня сохранения их уникальности, поэтому я бы предпочел использовать сами классы.

EDIT: Я сделал тест:

# file: a.py 
import datetime                 
D = datetime.datetime 

# file: b.py 
import datetime 
from a import D 
print hash(D) == hash(datetime.datetime) 

Печатает «Правда», но я до сих пор не уверен, если есть способ для того, чтобы быть Ложные для того же класса.

ответ

2

Это совершенно верно, но обратите внимание, что то, что вы делаете, - это подделка - добавление метода к этому классу.

Рассмотрите вопрос о том, было бы лучше добавить подходящие методы к вашим классам, либо обычным способом, либо, возможно, просто путем партизанского исправления. (Возможно, это не так, но учтите это).

+1

Спасибо. Я все еще считаю, что это необходимо для системы, которую я пытаюсь реализовать, но спасибо за предупреждение. – zefciu

2

Это совершенно нормально, поскольку классы - это сами объекты. Для объектов хеш-ключ - это место их памяти, которое гарантировано быть уникальным. Позвольте мне получить ссылку ...

+0

Меня не беспокоит отсутствие уникальности (что даст ложные срабатывания). Меня беспокоит тот же класс, который хранится в двух местах в памяти (что даст ложный отрицательный результат). – zefciu

+2

@zefciu, тот же класс нельзя хранить в двух местах в памяти, иначе это не то же самое ... – warvariuc

0

Хеш, если вы явно не переопределите его, будет id() - это место памяти.

Таким образом, любые два класса будут иметь другой хэш, если это не две ссылки на один и тот же экземпляр. Если это класс, установленный во время импорта модуля, то он будет быть тем же экземпляром, потому что код во время импорта выполняется один раз. Во всех остальных случаях, о которых я могу думать, это были бы разные случаи.

2

Совершенно верно, если вы используете класс в качестве словарного ключа, я сделал это пару раз. Однако наследование не будет работать, т. Е. Обработчик для класса не будет применяться к его подклассам, который может быть не таким, каким вы хотите. __mro__ может быть полезным в этом случае, но это решение кажется мне неправильным.

Смежные вопросы