Napisałem klasę, której implementacja .__hash__()
zajmuje dużo czasu. Myślałem o buforowaniu jego skrótu i przechowywaniu go w zmiennej, takiej jak ._hash
, więc metoda po prostu zwróci ._hash
. (Który zostanie obliczony na końcu .__init__()
lub po raz pierwszy .__hash__()
jest nazywany.)Python: Czy istnieje jakikolwiek powód * nie * do buforowania skrótu obiektu?
Moje rozumowanie było następujące: "Ten obiekt jest niezmienny -> Jego skrót nigdy się nie zmieni -> Mogę cachować hash."
Ale teraz to mnie zastanowiło: Możesz powiedzieć to samo o dowolnym, miekkim obiekcie, jakim jest. (Z wyjątkiem obiektów którego skrót jest ich identyfikator.)
Więc jest tam kiedykolwiek powód nie buforować hash obiektu, z wyjątkiem drobnych przedmiotów, których obliczenie skrótu jest bardzo szybki?
Oczywiście, jeśli obiekt jest zmienny, zwykle nie jest dobrym pomysłem zaimplementowanie '__hash__' w ogóle. Jedyne wbudowane zastosowania '__hash__' wymagają, aby skrót był stabilny. –
Nie, domyślna implementacja '__hash__' nie zwraca niczego innego po zmianie właściwości obiektu. Ponieważ domyślnie jest to prawdziwe dla dowolnego obiektu: 'hash (obj) == id (obj) == hash (id (obj))' - oznacza to, że obiekty po prostu przyjmują swój identyfikator jako swój skrót. Identyfikator jest statyczny, więc możesz powiedzieć, że obiekty domyślnie buforują swój skrót. –