Objektno programiranje v Python: razredi, opis in funkcije
V Pythonu so razredi temeljni koncept. To je osnova standardne knjižnice, dela najbolj priljubljenih programov in samega jezika. Če želite postati več kot le začetnik programer, morate razumeti bistvo in načelo dela z razredi in predmeti.
Vsebina
Kaj so razredi
To je osnovna programska komponenta OOP-a. V Pythonu se razredi uporabljajo za uvajanje novih vrst predmetov in se ustvarjajo z uporabo posebnega razreda. Zunaj so podobni standardnim vgrajenim tipom podatkov, kot so številke ali zaporedja. Toda razred predmeti imajo pomembno razliko - podpora za dedovanje.
Objektno programiranje v Pythonu v celoti temelji na hierarhični dediščini razredov. To je univerzalni način prilagajanja in ponovne uporabe kode. Toda objektno usmerjen pristop ni obvezen. Python omogoča brez procedur samo proceduralno in funkcionalno programiranje.
Glavna naloga razredov v Pythonu je pakiranje podatkov in izvedljive kode. Sintaktično so enaki kot navodila za def. Kot funkcije ustvarjajo lastna imena imen, ki jih je mogoče večkrat poklicati iz katerega koli dela programa. Zakaj je potem potrebno? Razredi so močnejše in vsestransko orodje. Predvsem pa se njihov potencial razkrije, ko nastajajo novi predmeti.
Pomen razredov in načelo dedovanja
Vsak nov objekt ima svoj lasten imenski prostor, ki ga lahko programirate, vnesete spremenljivke in ustvarite katerekoli funkcije. In tudi obstajajo atributi, ki jih podajamo iz razreda: object.attribute. To je pomen OOP.
Zaradi dedovanja se ustvari hierarhično drevo. V praksi je videti tako. Ko tolmač naleti na izraz object.attribute, začne iskati prvo pojavitev atributa v določenem razredu. Brez zaznavanja atributa tolmač še naprej išče v vseh povezanih razredih v zgornjem drevesu, od leve proti desni.
Drevo za iskanje vključuje:
- Superclasses, ki so na samem vrhu hierarhije in izvajajo skupno vedenje;
- podrazredi - spodaj;
- primeri so programski elementi z dednim obnašanjem.
Slika prikazuje drevo razreda Python. Iz primera vidimo, da sta razreda 2 in 3 superklasi. Na samem dnu sta dva primerka Instanca 1 in 2, na sredini - podrazreda razreda 1. Če napišete izraz Instance2.w, bo tolmač povzročil iskanje vrednosti atributa .w v naslednjem vrstnem redu:
- Instance2;
- Class1;
- Razred2;
- Razred3.
Ime .w najdete v Superclassu razreda 3. V terminologiji OOP to pomeni, da Instanca 2 "podeduje" atribut .w iz Class3.
Upoštevajte, da primere na sliki podedujejo le štiri atribute: .w, .x, .y in .z:
- Za primere Instance1.x in Instance2.x se atribut .x nahaja v razredu 1, kjer se bo iskanje ustavilo, ker je razred 1 v drevesu, nižjem od razreda 2.
- Za Instance1.y in Instance2.y se atribut .y nahaja v razredu 1, kjer se bo iskanje ustavilo, ker je to edini kraj, kjer se pojavi.
- Za primere Instance1.z in Instance2.z tolmač najde .z v 2. razredu, ker se nahaja v drevesu levo od razreda3.
- Za Instance2.name se atribut .name nahaja v Instance2 brez iskanja drevesa.
Predzadnji element je najpomembnejši. Prikazuje, kako razred 1 preglasi atribut .x, in nadomešča .x različico nadklase razreda 2.
Objekti, primerki in metode
OOP deluje z dvema glavnima pojmoma: razredi in predmeti. Razredi ustvarjajo nove vrste, predmeti razreda v Pythonu pa so njihovi primerki. Na primer, vse spremenljivke celo število se nanašajo na vgrajeno vrsto podatkov int. V jeziku OOP so to primerki razreda int.
Razredi se ustvarjajo z navodili, predmeti pa se ustvarijo z uporabo klicev. Lahko shranjujejo podatke in imajo lastne funkcionalnosti ali razredne metode. V Pythonu igra pomembno vlogo terminologija. Programska oprema s svojo pomočjo razlikuje neodvisne funkcije od tistih, ki spadajo v razrede. Spremenljivke, povezane s predmeti, imenujemo polja.
V OOP sta dve vrsti polj. Prva je spremenljivka, ki pripada celotnemu razredu, druga pa spremenljivke posameznih primerov. Polja in metode skupaj so atributi razreda. V Python-u so napisani v kodnem bloku po razredu ključnih besed.
Metode in pomen samega
Metode so funkcije z dodatnim imenom self. Dodana je na vrh seznama parametrov. Po želji lahko spremenljivko imenujemo drugo ime, vendar taka pobuda med programerji ni dobrodošla. Sam je standardno, zlahka prepoznavno ime v kodi. Poleg tega so nekatera razvojna okolja oblikovana za delo z njim.
Da bi bolje razumeli vrednost self v OOP, si predstavljamo, da imamo razred, imenovan ClassA in methodA:
- > razred razreda A;
- def methodA (self, argument1, argument2).
ObjektA je primer razreda A in klic metode je videti takole:
- > objectA.methodA (argument1, argument2).
Ko tolmača vidi to vrstico, jo samodejno pretvori v naslednje: ClassA.methodA (objectA, argument1, argument2). To pomeni, da primerek razreda uporablja spremenljivko sam kot referenco k sebi.
Kako ustvariti spremenljivke, metode in primere razredov
Nudimo razstaviti praktični primer iz interaktivne Pythonove lupine. Ustvarjanje razreda »Preizkus prvega« se začne s sestavljenim stavkom:
- > razred Eksperiment First:
- def setinf (self, value): # ustvarite prvo metodo z argumenti
- self.data = vrednost
- def display (self): # druga metoda
- print (self.data) # natisni podatke primerka.
Po obvezni zaprtosti sledi blok z vgrajenimi def definirami, pri čemer sta dva funkcijska objekta dodeljena imenom setinf in prikaz. Z njihovo pomočjo so ustvarjeni atributi Experiment First.setinf in Experiment First.display. Dejansko je vsako ime, ki mu je dodeljena vrednost na najvišji ravni v ugnezdenem bloku, atribut.
Če želite videti, kako delujejo metode, morate ustvariti dva primera:
- > x = Experiment First () # Ustvarili sta dva primerka;
- > y = Experiment First () # Vsak je ločen imenski prostor.
Na začetku instanci ne hranijo nobenih informacij in so popolnoma prazne. Vendar so povezani z njihovim razredom:
- > x.setinf ("Učenje Python") # Klicanje metode, v kateri je self je x.
- > y.setinf (3.14) # Ekvivalent: Eksperiment First.setinf (y, 3.14)
Če se prek imena primerka x, y nanaša na atribut .setinf objekta Object Experiment, potem tolmač vrne vrednost atributa razreda kot rezultat iskanja drevesa dedovanja.
- > x.display () # x in y imajo lastne vrednosti self.data
- Spoznajte Python
- > y.display ()
- 3.14.
Preobremenitev operaterja
V Pythonu lahko razredi preobremenijo izraze za izražanje. Ta možnost omogoča primerke, podobne vgrajenim tipom podatkov. Proces sestoji iz izvedbenih metod s posebnimi imeni, ki se začnejo in konca z dvojnimi podčrtavami.
Razmislite v akciji __init__ in __sub__. Prva metoda se imenuje konstruktor razreda. V Pythonu __init__ izvaja preobremenitev pri ustvarjanju primerka. Druga metoda __sub__ izvede postopek odštevanja.
- > razred Preobremenitev: # ustvari nov razred
- def __init __ (self, start):
- self.data = start
- def __sub __ (sam, drugi): # primerka minus druga
- return Overload (self.data - drugo) # Rezultat je nov primer
- > A = preobremenitev (10) #__ init __ (A, 10)
- > B = A - 2 #__ sub __ (B, 2)
- > B.data # B je nov primerek razreda Overload
- 8.
Več o metodi __init__
Metoda __init__ se najpogosteje uporablja pri delu z razredi. Nepogrešljivo je za inicializacijo različnih predmetov. __init__ ni treba posebej poklicati. Ko je ustvarjen nov primer, metoda samodejno prejme argumente, navedene v oklepajih.
Z metodami preobremenitve lahko izvedete vse operacije z vgrajenimi vrstami podatkov. Večina se uporablja le pri reševanju posebnih nalog, pri katerih je treba predmete posnemati obnašanje standardnih predmetov.
Metode so podedovane iz superclasa in niso obvezne. V začetnih fazah lahko enostavno brez njih. Toda za popolno potopitev v programiranje in bistvo OOP-a, morate delati z operaterji.
__getitem__ metoda
Metoda __getitem__ izvede preobremenitev dostopa do elementa na indeksu. Če je podedovana ali prisotna v definiciji razreda, jo bo samodejno preimenoval za vsako operacijo indeksiranja. Na primer, ko se na indeksu, na primer F [i], pojavi primer iz F, se interni klic Python kliče po metodi __getitem__, v prvem argumentu premakne predmet F in indeks, naveden v kvadratni oklepaji, v drugem.
Naslednji indeks indeksnega indeksa vrne kvadrat indeksne vrednosti:
- > razred SampleIndexation:
- def __getitem __ (samo, indeks):
- indeks donosa ** 2
- > F = Primer indeksiranja ()
- > F [2] # Izraz F [i] pokliče F .__ getitem __ (i)
- 4
- > za i v razponu (5):
- print (F [i], end = "") # Klici __getitem __ (F, i) v vsaki iteraciji
- 0 1 4 9 16
Z isto metodo lahko izvedete operacijo izločanja rezin, ki se pogosto uporablja pri delu z zaporedji. Pri obdelavi seznamov je standardna sintaksa za operacijo naslednja:
- > List = [13, 6, "in", "z", 74,9]
- > Seznam [2: 4]
- ["In", "c"]
- > Seznam [1:]
- [6, "in", "c", 74,9]
- > Seznam [: - 1]
- [13, 6, "in", "c"]
- > Seznam [:: 2]
- [13, "in", 74,9]
Razred, ki izvaja metodo __getitem__:
- > Razred Indexer:
- my_list = [13, 6, "in", "z", 74,9]
- def __getitem __ (samo, indeks): # Pokliče, ko indeksira ali izvleče rezino
- natisni ("getitem:", indeks)
- vrni self.my seznam [index] # Izvrši indeksiranje ali izvleči rezino
- > X = Indexer ()
- > X [0] # Pri indeksiranju, __getitem__ dobi celo število
- getitem: 0
- 13
- > X [2: 4] # Ko izvlečemo rezino, __getitem__ prejme predmet rezine
- getitem: rezina (2, 4, brez)
- ["In", "c"]
Dostopi za atribute
Za sklicevanje na atribut uporabite posebno metodo __getattr__. Kliče se z imenom atributa v obliki niza v primerih odkrivanja poskusa pridobiti sklic na neobstoječ ali nedoločen atribut. Ko lahko tolmač najde želeni predmet v drevesu dediščine, __getattr __. Se ne pokliče.
Metoda je primerna za splošno obdelavo zahtevkov za atribute:
- > razred Gone:
- def __getattr __ (sam, atname):
- če atname == "starost":
- vrnitev 20
- drugače:
- dvigni atribut AttributeError, atname
- > D = Gone ()
- > D.age
- 20
- > D.name
- AttributeError: ime
Razred Gone in njegov primer D nimata lastnih atributov. Zato se pri dostopu do D.age samodejno kliče metoda __getattr__. Sam primer je prejel kot jaz, toda ime nedefinirane "starosti" v nizu atname. Razred vrne rezultat dostopa do imena D.age, kljub temu, da nima tega atributa.
Če razred ne zagotavlja ravnanja z atributom, metoda __getattr__ pokliče vgrajeno izjemo in s tem prevaža podatke tolmaču, da je ime dejansko nedefinirano. V tem primeru poskuša dostop do imena D.name povzročiti napako.
Način preobremenitve operaterja __setattr__ deluje na podoben način, prestreza vsak poskus dodeljevanja vrednosti atributa. Če je ta metoda registrirana v telesu razreda, se izraz "self.attribute = vrednost" pretvori v poziv sami .__ setattr _ ("atribut", vrednost).
Opisali smo le nekaj obstoječih metod preobremenitve. Celoten seznam je v standardnem jezikovnem vodiču in vsebuje veliko več imen.
Dodatne funkcije
OOP se včasih uporablja za zapletene in nestandardne naloge. Z dedovanjem razredov v Pythonu je vedenje vgrajenih podatkovnih tipov in njihovih zmožnosti mogoče razširiti in prilagoditi.
Če niste zadovoljni z dejstvom, da se indeksiranje v sekvencah začne od nič, ga lahko popravite z izjavo razreda. Če želite to narediti, ustvarite podrazred seznama vrst z novimi imeni vseh vrst in izvedite potrebne spremembe. Tudi v OOP-u v Pythonu so dekoratorji funkcij, statične metode in številne druge zapletene in posebne tehnike.
- Objektno programiranje
- Strukturirano programiranje
- Java: regularni izrazi, posebni znaki
- Kaj je Ruby? Programski jezik `Ruby`
- Kakšna je encapsulation? Inkapsulacija v programiranju
- OOP je kaj? Osnovna načela objektno usmerjenega programiranja
- Python - kaj je to? Programski jezik na visoki ravni
- Programski jezik Python: zank
- PHP konstrukt: ustvarjanje primerkov razredov
- Kaj je proceduralno programiranje?
- Programiranje v Python: Seznam
- Vhod in izhod v Python. Vnos in tiskanje
- Programiranje v Pythonu. Delo z nizi
- Kako najti preostanek delitve v Pythonu?
- Pogojna konstrukcija if. Python: prostranost in preprostost jezika
- Python: vrste podatkov, pogoji, zahteve in primeri
- Kaj so str objekti v Pythonu?
- Pogojni stavki, če / else v Python: skladnja in uporaba
- Standardne C ++ knjižnice
- Sintaksa jаvascript parseInt: primeri uporabe
- Kakšna je tehnična zasnova informacijskega sistema?