Перезапись функции __hash__ только для hash self .__ class__. __name__ не будет работать, если объект используется как ключ в dict [duplicate]

Краткий ответ: ваш метод foo() возвращается немедленно, а вызов $ajax() выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.

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

function foo(result) {
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;   // Store the async result
        }
    });
}

var result = { response: null };   // Object to hold the async result
foo(result);                       // Returns before the async completes

Обратите внимание, что вызов foo() ] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response.

153
задан aknuds1 23 October 2014 в 12:03
поделиться

3 ответа

Вам нужно добавить 2 метода , отметить __hash__ и __eq__:

class MyThing:
    def __init__(self,name,location,length):
        self.name = name
        self.location = location
        self.length = length

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

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

    def __ne__(self, other):
        # Not strictly necessary, but to avoid having both x==y and x!=y
        # True at the same time
        return not(self == other)

Документация Python dict определяет эти требования на ключевые объекты, т. е. они должны быть хешируемыми .

179
ответ дан The Red Pea 5 September 2018 в 09:04
поделиться

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

Python ожидает, что __hash__ вернет целое число, возврат Banana() не рекомендуется :)

Пользовательские классы имеют __hash__ по умолчанию вызывает id(self), как вы отметили.

В документации есть несколько дополнительных советов.:

Классы, которые наследуют метод __hash__() от родительского класса, но изменяют значение __cmp__() или __eq__() таким образом, что возвращаемое значение хеша больше не подходит (например, путем перехода к концепции равенства, основанной на значении, вместо основанного на стандарте равенство) может явно обозначить себя как нечувствительный, установив __hash__ = None в определение класса. Это означает, что не только экземпляры класса повышают соответствующий TypeError, когда программа пытается получить их хеш-значение, но они также будут корректно идентифицированы как нечувствительные при проверке isinstance(obj, collections.Hashable) (в отличие от классов, которые определяют свои собственные __hash__(), чтобы явно поднять TypeError).

19
ответ дан Skurmedel 5 September 2018 в 09:04
поделиться

Альтернативой в Python 2.6 или выше является использование collections.namedtuple() - это избавляет вас от написания каких-либо специальных методов:

from collections import namedtuple
MyThingBase = namedtuple("MyThingBase", ["name", "location"])
class MyThing(MyThingBase):
    def __new__(cls, name, location, length):
        obj = MyThingBase.__new__(cls, name, location)
        obj.length = length
        return obj

a = MyThing("a", "here", 10)
b = MyThing("a", "here", 20)
c = MyThing("c", "there", 10)
a == b
# True
hash(a) == hash(b)
# True
a == c
# False
29
ответ дан Sven Marnach 5 September 2018 в 09:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: