Maišos () metodas grąžina objekto maišos vertę, jei jis ją turi.
Maišos reikšmės yra tik sveiki skaičiai, kurie naudojami norint greitai palyginti žodyno raktus ieškant žodyno raktų.
Viduje hash()
metodas reikalauja __hash__()
objekto metodo, kuris pagal numatytuosius nustatymus nustatomas bet kuriam objektui. Mes tai pažiūrėsime vėliau.
hash()
Metodo sintaksė yra:
maišos (objektas)
maišos () parametrai
hash()
metodas apima vieną parametrą:
- objektas - objektas, kurio maišos reikšmė turi būti grąžinta (sveikasis skaičius, eilutė, plūdė)
Grąžinimo vertė iš maišos ()
hash()
metodas grąžina objekto maišos vertę, jei ji ją turi.
Jei objekte yra pasirinktinis __hash__()
metodas, jis sutrumpina grąžinimo vertę iki dydžio Py_ssize_t
.
1 pavyzdys: Kaip „hash“ () veikia „Python“?
# 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'))
Rezultatas
Hash for 181 yra: 181 Hash for 181.23 is: 530343892119126197 Hash for Python is: 2230730083538390373
2 pavyzdys: nekintamo paketo objekto maiša ()?
hash()
metodas tinka tik nekintamiems objektams kaip dvigubam.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Rezultatas
Maiša yra: -695778075465126279
Kaip maiša () veikia pasirinktiniams objektams?
Kaip minėta aukščiau, hash()
metodas vidiniu būdu vadina __hash__()
metodą. Taigi, bet kokie objektai gali nepaisyti __hash__()
pasirinktinių maišos verčių.
Tačiau norint teisingai pritaikyti maišos, __hash__()
visada reikia pateikti sveikąjį skaičių. Ir abu, __eq__()
ir __hash__()
metodai turi būti įgyvendinti.
Toliau pateikiami teisingo __hash__()
nepaisymo atvejai .
__eq __ () | __hash __ () | apibūdinimas |
---|---|---|
Apibrėžta (pagal numatytuosius nustatymus) | Apibrėžta (pagal numatytuosius nustatymus) | Jei paliekama tokia, kokia yra, visi objektai lyginami nevienodai (išskyrus save) |
(Jei keičiama) Apibrėžta | Neturėtų būti apibrėžta | Norint pritaikyti maišos rinkimą, reikia, kad rakto maišos vertė būtų nekintama |
Neapibrėžtas | Neturėtų būti apibrėžta | Jei __eq__() nėra apibrėžta, __hash__() neturėtų būti apibrėžta. |
Apibrėžta | Neapibrėžtas | Kurso egzemplioriai nebus naudojami kaip maišos kolekcija. __hash __ () implicitiškumas nustatytas į None . Suteikia TypeError išimtį, jei bandoma gauti maišos. |
Apibrėžta | Išlaikykite iš tėvų | __hash__ = .__hash__ |
Apibrėžta | Nenori maišyti | __hash__ = None . Pakelia „TypeError“ išimtį, jei bandoma nuskaityti maišos. |
3 pavyzdys: pritaikytų objektų maiša (), pakeisdama __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))
Rezultatas
Maiša yra: 3785419240612877014
Pastaba: Nereikia įdiegti __eq__()
maišos metodo, nes jis pagal numatytuosius nustatymus sukurtas visiems objektams.