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 . TypeError Kivé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.