Как вычислить хеш объекта класса Python - PullRequest
0 голосов
/ 13 декабря 2018

В python3 у меня есть класс.Как показано ниже:

class Foo:
    def __init__(self):
        self.x = 3
    def fcn(self, val):
        self.x += val

Затем я создаю экземпляры объектов этого класса, например так:

new_obj = Foo()
new_obj2 = Foo()

Теперь, когда я хеширую эти объекты, я получаю различные значения хеш-функции ,Мне нужно, чтобы они возвращали один и тот же хеш, так как это одни и те же объекты (в теории).

Есть идеи, как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Они не один и тот же объект.Выражение Foo() вызывает конструктор класса Foo.__init__, который возвращает новый, уникальный экземпляр объекта при каждом вызове.Ваши два вызова возвращают два независимых объекта, находящихся в разных местах памяти, каждый из которых содержит свой собственный частный экземпляр атрибута x.

Возможно, вы захотите ознакомиться с классом Python и теорией экземпляров.

0 голосов
/ 13 декабря 2018

Спасибо всем, кто ответил.Вы правы, что создание экземпляра нового объекта того же класса не на самом деле , то же самое, поскольку оно занимает другое место в памяти.То, что я закончил, похоже на то, что предложил @nosklo.

Я создал функцию 'get_hashables', которая возвращала словарь со всеми свойствами класса, который будет составлять уникальный объект класса, например:

def get_hashables(self):
    return {'data': self.data, 'result': self.result}

Тогда мой основной метод взял бы эти «хешируемые» переменные и хэшировал их для создания самого хэша.

0 голосов
/ 13 декабря 2018
class Foo:
    def __init__(self):
        self.x = 3
    def fcn(self, val):
        self.x += val
    def __hash__(self):
        return hash(self.x)

Это вычислит хеш, используя self.x;Это означает, что хеш будет таким же, когда self.x одинаково.Вы можете вернуть что-нибудь из __hash__, но для предотвращения ошибок согласованности вы должны вернуть тот же хеш, если объекты сравниваются одинаково.Подробнее об этом в документах .

...