Metoda hash () zwraca wartość skrótu obiektu, jeśli taki posiada.
Wartości skrótu to tylko liczby całkowite używane do szybkiego porównywania kluczy słownika podczas wyszukiwania w słowniku.
Wewnętrznie hash()
metoda wywołuje __hash__()
metodę obiektu, która jest domyślnie ustawiona dla dowolnego obiektu. Przyjrzymy się temu później.
Składnia hash()
metody to:
hash (obiekt)
hash () Parametry
hash()
metoda przyjmuje jeden parametr:
- obiekt - obiekt, którego wartość hash ma zostać zwrócona (liczba całkowita, ciąg znaków, zmiennoprzecinkowa)
Wartość zwracana z hash ()
hash()
metoda zwraca wartość skrótu obiektu, jeśli taki posiada.
Jeśli obiekt ma niestandardową __hash__()
metodę, obcina zwracaną wartość do rozmiaru Py_ssize_t
.
Przykład 1: Jak działa hash () w Pythonie?
# hash for integer unchanged print('Hash for 181 is:', hash(181)) # hash for decimal print('Hash for 181.23 is:',hash(181.23)) # hash for string print('Hash for Python is:', hash('Python'))
Wynik
Hash dla 181 to: 181 Hash dla 181,23 to: 530343892119126197 Hash dla Pythona to: 2230730083538390373
Przykład 2: hash () dla niezmiennego obiektu krotki?
hash()
metoda działa tylko dla niezmiennych obiektów jako krotki.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Wynik
Wartość skrótu to: -695778075465126279
Jak działa funkcja hash () w przypadku obiektów niestandardowych?
Jak wspomniano powyżej, hash()
method wewnętrznie wywołuje __hash__()
metodę method. Zatem dowolne obiekty mogą przesłonić __hash__()
niestandardowe wartości skrótu.
Ale dla poprawnej implementacji skrótu, __hash__()
zawsze powinien zwracać liczbę całkowitą. I zarówno __eq__()
i __hash__()
metody muszą być wdrożone.
Poniżej znajdują się przypadki poprawnego __hash__()
zastąpienia.
__eq __ () | __haszysz__() | Opis |
---|---|---|
Zdefiniowano (domyślnie) | Zdefiniowano (domyślnie) | Jeśli pozostawisz tak, jak jest, wszystkie obiekty są nierówne (z wyjątkiem siebie) |
(Jeśli zmienny) Zdefiniowany | Nie powinno być definiowane | Implementacja kolekcji z możliwością mieszania wymaga, aby wartość skrótu klucza była niezmienna |
Nie określono | Nie powinno być definiowane | Jeśli __eq__() nie jest zdefiniowane, __hash__() nie powinno być definiowane. |
Zdefiniowany | Nie określono | Instancje klas nie będą używane jako kolekcja z możliwością mieszania. Implikacja __hash __ () ustawiona na None . Podnosi TypeError wyjątek, jeśli próbujesz pobrać skrót. |
Zdefiniowany | Zachowaj od rodzica | __hash__ = .__hash__ |
Zdefiniowany | Nie chce haszować | __hash__ = None . Podnosi wyjątek TypeError w przypadku próby pobrania skrótu. |
Przykład 3: hash () dla obiektów niestandardowych przez zastąpienie __hash __ ()
class Person: def __init__(self, age, name): self.age = age self.name = name def __eq__(self, other): return self.age == other.age and self.name == other.name def __hash__(self): print('The hash is:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))
Wynik
Wartość skrótu to: 3785419240612877014
Uwaga: Nie musisz implementować __eq__()
metody dla skrótu, ponieważ jest ona tworzona domyślnie dla wszystkich obiektów.