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 TypeErrorwyją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.








