A hash () metódus egy objektum hash értékét adja vissza, ha rendelkezik ilyennel.
A hash értékek csak egész számok, amelyeket a szótár kulcsainak összehasonlítására használnak a szótár gyors keresése során.
Belsőleg a hash()method hívja __hash__()meg az objektum metódusát, amelyet alapértelmezés szerint bármely objektumhoz beállítanak. Ezt később megnézzük.
A hash()módszer szintaxisa :
hash (objektum)
hash () paraméterek
hash() A módszer egyetlen paramétert vesz fel:
- object - az az objektum, amelynek hash értékét vissza kell adni (egész szám, karakterlánc, float)
A hash () visszatérési értéke
hash() A metódus egy objektum hash értékét adja vissza, ha rendelkezik ilyennel.
Ha egy objektum egyéni __hash__()metódussal rendelkezik, akkor a visszatérési értéket a méretre csonkolja Py_ssize_t.
1. példa: Hogyan működik a hash () a Pythonban?
# 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'))
Kimenet
Hash for 181 is: 181 Hash for 181.23 is: 530343892119126197 Hash for Python is: 2230730083538390373
2. példa: hash () változatlan tuple objektumhoz?
hash() metódus csak megváltoztathatatlan objektumok esetén működik kettősként.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Kimenet
A kivonat: -695778075465126279
Hogyan működik a hash () az egyedi objektumoknál?
Amint fentebb említettük, a hash()method belső hívás __hash__()módszer. Tehát bármely objektum felülírhatja __hash__()az egyedi kivonatolási értékeket.
A helyes kivonatolás megvalósításához __hash__()azonban mindig egész számot kell adnia. És mindkettőt, __eq__()és a __hash__()módszereket is végre kell hajtani.
Az alábbiakban bemutatjuk a helyes __hash__()felülírás esetét .
| __eq __ () | __hash __ () | Leírás |
|---|---|---|
| Meghatározott (alapértelmezés szerint) | Meghatározott (alapértelmezés szerint) | Ha van, akkor minden objektum egyenlőtlen (önmaguk kivételével) |
| (Ha változtatható) Meghatározott | Nem szabad meghatározni | A hashable gyűjtemény megvalósításához a kulcs hash értéke változhatatlan |
| Nem meghatározott | Nem szabad meghatározni | Ha __eq__()nincs meghatározva, akkor __hash__()nem szabad meghatározni. |
| Meghatározott | Nem meghatározott | Az osztálypéldányok nem lesznek használhatók hashable gyűjteményként. __hash __ () implicititás beállítva None. TypeErrorKivételt emel, ha megpróbálja lekérni a kivonatot. |
| Meghatározott | Megtartás a szülőtől | __hash__ = .__hash__ |
| Meghatározott | Nem akar hashelni | __hash__ = None. Emeli a TypeError kivételt, ha megpróbálja lekérni a kivonatot. |
3. példa: hash () az egyéni objektumokhoz a __hash __ () felülírásával
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))
Kimenet
A kivonat: 3785419240612877014
Megjegyzés: Nem kell végrehajtania __eq__()a kivonatolás metódusát, mivel az alapértelmezés szerint minden objektumra létrejön.








