Kaikki Pythonissa on esine, tai niin sanotaan. Jos haluat luoda omia mukautettuja objekteja, joilla on omat ominaisuudet ja menetelmät, käytä Pythonin luokassa
vastustaa sitä. Luokkien luominen Pythonissa tarkoittaa toisinaan kuitenkin toistuvien, kattilakoodien kirjoittamista kuormien luomiseksi luokan ilmentymälle sille välitetyistä parametreista tai luomaan yhteisiä toimintoja, kuten vertailuoperaattorit.
Dataclasses, jotka on otettu käyttöön Python 3.7: ssä (ja tuettu takaisin Python 3.6: een), tarjoavat kätevän tavan tehdä luokista vähemmän yksityiskohtaisia. Monet tavallisista asioista, joita teet luokassa, kuten ominaisuuksien pikaistaminen luokalle välitetyistä argumenteista, voidaan supistaa muutamaan perusohjeeseen.
Esimerkki Python-tietoluokasta
Tässä on yksinkertainen esimerkki tavanomaisesta luokasta Pythonissa:
luokan kirja:'' Kohde fyysisten kirjojen seuraamiseen kokoelmassa. '' '
def __init __ (itse, nimi: str, paino: kellua, hyllyn tunnus: int = 0):
itse.nimi = nimi
oma paino = paino # grammoina, lähetyslaskenta varten
self.shelf_id = hyllyn_id
def __repr __ (itse):
return (f "Kirja (nimi = {itse.nimi! r},
paino = {itsepaino! r}, hyllyn_id = {itse.hyllyn_id! r}) ")
Suurin päänsärky tässä on tapa, jolla jokainen argumentti välitettiin__sen sisällä__
on kopioitava kohteen ominaisuuksiin. Tämä ei ole niin huono, jos olet vain tekemisissäKirja
, mutta entä jos joudut käsittelemäänKirjahylly
, Kirjasto
, Varasto
, ja niin edelleen? Lisäksi, mitä enemmän koodia sinun on kirjoitettava käsin, sitä suuremmat mahdollisuudet teet virheen.
Tässä on sama Python-luokka, joka on toteutettu Python-tietoluokkana:
dataclassesista tuo dataclass @dataclass class Kirja: '' 'Kohde fyysisten kirjojen seuraamiseen kokoelmasta.' '' nimi: str paino: float shelf_id: int = 0
Kun määrität ominaisuuksia, kutsutaankentät, tietoluokassa,@dataclass
luo automaattisesti kaikki koodit, joita tarvitaan niiden alustamiseen. Se säilyttää myös kunkin ominaisuuden tyyppitiedot, joten jos käytät koodisäiliötä, kutenmypy
, se varmistaa, että toimitat oikean tyyppisiä muuttujia luokan rakentajalle.
Toinen asia@dataclass
kulissien takana luo automaattisesti koodin useille luokan yleisimmille menetysmenetelmille. Yllä olevassa perinteisessä luokassa meidän oli luotava oma__repr__
. Dataluokassa tämä on tarpeetonta.@dataclass
tuottaa__repr__
sinulle.
Kun tietoluokka on luotu, se on toiminnallisesti identtinen tavallisen luokan kanssa. Dataklassin käytöstä ei peritä suoritusrangaistusta, lukuun ottamatta sisustajan vähäisiä yleiskustannuksia luokkamäärittelyä ilmoitettaessa.
Muokkaa Python-tietoluokan kenttiäala
toiminto
Oletustavan tietoluokkien pitäisi olla kunnossa useimmissa käyttötapauksissa. Joskus sinun on kuitenkin hienosäädettävä, kuinka tietokannan kentät alustetaan. Voit tehdä tämän käyttämälläala
toiminto.
datakursseista tuo tietoluokka, kenttä kirjoittamalla tuonti List @dataclass class Kirja: '' 'Kohde fyysisten kirjojen seuraamiseen kokoelmassa.' '' nimi: str ehto: str = kenttä (vertaa = väärä) paino: float = kenttä (oletus = 0.0, repr = väärä) shelf_id: int = 0 lukua: Lista [str] = kenttä (oletus_tehdas = luettelo)
Kun määrität oletusarvoksi ilmentymänala
, se muuttaa kentän asetustapaa riippuen antamistasi parametreistaala
. Nämä ovat yleisimmin käytetyt vaihtoehdot ala
(on muitakin):
oletuksena
: Asettaa kentän oletusarvon. Sinun täytyy käyttääoletuksena
jos a) käytätala
muuttaa muita kentän parametreja ja b) haluat asettaa oletusarvon kentälle sen päälle. Tässä tapauksessa käytämmeoletuksena
asettaapaino
että0.0
.oletus_tehdas
: Antaa sellaisen toiminnon nimen, joka ei ota parametreja ja joka palauttaa objektin kentän oletusarvoksi. Tässä tapauksessa haluammeluvut
olla tyhjä luettelo.edustaja
: Oletuksena (Totta
), valvoo, näkyykö kyseinen kenttä automaattisesti luotavassa kentässä__repr__
datakurssille. Tässä tapauksessa emme halua kirjan painon näkyvän__repr__
, joten käytämmerepr = väärä
jättää se pois.vertailla
: Oletuksena (Totta
), sisältää kentän vertailumenetelmiin, jotka luodaan automaattisesti tietoluokalle. Täällä emme haluakunto
käytetään osana kahden kirjan vertailua, joten asetimmevertaa =
Väärä
.
Huomaa, että meidän on täytynyt säätää kenttien järjestystä siten, että ei-oletuskentät tulevat ensin.
Käyttää__post_init__
ohjata Python-tietoluokan alustus
Tässä vaiheessa luultavasti ihmettelet: Jos__sen sisällä__
dataklassimenetelmä luodaan automaattisesti, miten pääsen aloitusprosessin hallintaan tekemään tarkempia muutoksia?
Syötä__post_init__
menetelmä. Jos sisällytät__post_init__
-menetelmää tietokassan määrittelyssä, voit antaa ohjeita kenttien tai muun instanssitiedon muokkaamiseen
datakursseista tuo tietoluokka, kenttä kirjoittamalla tuonti List @dataclass class Kirja: '' 'Kohde fyysisten kirjojen seuraamiseen kokoelmassa.' '' nimi: str paino: float = kenttä (oletus = 0.0, repr = False) shelf_id: int = kenttä (init = väärä) luvut: Lista [str] = kenttä (oletus_tehdas = luettelo) ehto: str = kenttä (oletus = "Hyvä", vertaa = väärä) def __post_init __ (itse): jos itsetiedote == "Hylätty ": self.shelf_id = Ei kukaan muu: self.shelf_id = 0
Tässä esimerkissä olemme luoneet a__post_init__
asetettava menetelmä shelf_id
ettäEi mitään
jos kirjan tila alustetaan muodossa"Hylätty"
. Huomaa kuinka käytämmeala
alustaashelf_id
ja passsen sisällä
kutenVäärä
ettäala
. Tämä tarkoittaashelf_id
ei alusteta__sen sisällä__
.
KäyttääInitVar
ohjata Python-tietoluokan alustus
Toinen tapa mukauttaa Python-tietoluokan asetuksia on käyttääInitVar
tyyppi. Tämän avulla voit määrittää kentän, jolle välitetään__sen sisällä__
ja sitten__post_init__
, mutta ei tallenneta luokan ilmentymään.
Käyttämällä InitVar
, voit ottaa käyttöön parametreja määrittäessäsi tietoluokkaa, joita käytetään vain alustuksen aikana. Esimerkki:
datakursseista tuo tietoluokka, kenttä, InitVar kirjoittamalla tuontilista @dataclass class Kirja: '' 'Objekti kokoelman fyysisten kirjojen seuraamiseksi.' '' nimi: str ehto: InitVar [str] = Ei mitään painoa: float = kenttä (oletus = 0.0, repr = False) shelf_id: int = field (init = False) chapters: List [str] = field (default_factory = list) def __post_init __ (self, condition): if condition == "Hylätty": self.shelf_id = Ei kukaan muu: self.shelf_id = 0
Kentän tyypiksi asetetaanInitVar
(sen alatyyppi on todellinen kenttätyyppi) signaaleja@dataclass
ei tehdä kyseisestä kentästä dataluokakentäksi, vaan siirtää tiedot eteenpäin__post_init__
argumenttina.
Tässä versiossaKirja
luokassa, emme varastoikunto
kenttänä luokan esiintymässä. Käytämme vain kunto
alustusvaiheen aikana. Jos löydämme senkunto
asetettiin"Hylätty"
, asetammeshelf_id
ettäEi mitään
- mutta emme säilytäkunto
luokan instanssissa.
Milloin käyttää Python-tietoluokkia - ja milloin niitä ei pidä käyttää
Yksi yleinen skenaario tietoluokkien käytöstä on nimettyjen korvaaminen. Datakurssit tarjoavat samanlaisen käyttäytymisen ja enemmän, ja niistä voidaan tehdä muuttumattomia (kuten nimelliset ominaisuudet ovat) yksinkertaisesti käyttämällä@dataclass (jäädytetty = True)
sisustajana.
Toinen mahdollinen käyttötapaus on sisäkkäisten sanakirjojen korvaaminen, joiden kanssa työskenteleminen voi olla hankalaa, datakurssien sisäkkäisillä esiintymillä. Jos sinulla on tietoluokkaKirjasto
, luettelo-ominaisuudellahyllyt
, voit käyttää tietoluokkaaLukuhuone
lisätä luettelo ja lisätä sitten menetelmiä, joiden avulla sisäkkäisiä kohteita (esim. kirja tietyn huoneen hyllyllä) on helppo käyttää.
Mutta kaikkien Python-luokkien ei tarvitse olla tietoluokka. Jos luot luokkaa lähinnä keinona ryhmittää joukkostaattiset menetelmät, eikä tietojen säilönä, sinun ei tarvitse tehdä siitä tietoluokkaa. Esimerkiksi jäsentäjien kanssa yleinen malli on saada luokka, joka ottaa abstraktin syntaksipuun, kävelee puussa ja lähettää kutsuja luokan eri menetelmiin solmutyypin perusteella. Koska jäsentäjäluokalla on hyvin vähän omaa dataa, tietoluokka ei ole tässä hyödyllinen.
Kuinka tehdä enemmän Pythonilla
- Aloita asynkronointi Pythonissa
- Asyncion käyttäminen Pythonissa
- Kuinka käyttää PyInstalleria Python-suoritettavien tiedostojen luomiseen
- Cython-opetusohjelma: Kuinka nopeuttaa Pythonia
- Kuinka asentaa Python älykkäästi
- Kuinka hallita Python-projekteja Poetryn avulla
- Kuinka hallita Python-projekteja Pipenv: llä
- Virtualenv ja venv: Python-virtuaaliympäristöt selitetty
- Python virtualenv ja venv do and don'ts
- Python-ketjuttaminen ja aliprosessit on selitetty
- Kuinka käyttää Python-virheenkorjainta
- Kuinka käyttää timeit Python-koodin profilointiin
- CProfilen käyttäminen Python-koodin profilointiin
- Kuinka muuntaa Python JavaScriptiksi (ja takaisin)