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 TypeErroriš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.








