Ohjelmointi

Kuinka käyttää Python-tietoluokkia

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äänKirjahyllyKirjastoVarasto, 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_idja 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)
$config[zx-auto] not found$config[zx-overlay] not found