Каков метод __hash__ по умолчанию в Sage?

У меня есть класс Sage, который наследуется от SageObject. Согласно документации Python,

Пользовательские классы имеют __cmp__()а также __hash__() методы по умолчанию; с ними все объекты сравниваются неравно (кроме самих себя) и x.__hash__() возвращается id(x),

Тем не менее, мой класс не делает этого, несмотря на то, что он не реализует __hash__ метод свой. Вместо этого он использует значение хеш-функции своего строкового представления (которое возвращается его __str__ метод). Эта часть дизайна классов Sage отличается от обычных классов Python? Существует ли иерархия мест, которые Sage мог бы искать, чтобы найти приемлемое значение хеша?

1 ответ

Решение

К счастью, вы практически ответили на вопрос самостоятельно. Попробуйте ?? трюк, чтобы найти исходный код.

sage: SageObject.__hash__??
Type:       wrapper_descriptor
Base Class: <type 'wrapper_descriptor'>
String Form:    <slot wrapper '__hash__' of 'sage.structure.sage_object.SageObject' objects>
Namespace:  Interactive
Definition: SageObject.__hash__(self)
Source:
    def __hash__(self):
        return hash(self.__repr__())

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

Другие вопросы по тегам