Objektno usmerjeno programiranje na Pythonu: razredi, opis in funkcije

Razredi Pythona so temeljni pojem. 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.

Kateri so razredi

To je osnovna programska komponenta PLO. V razredih Python se uporabljajo za izvajanje novih tipov objektov in so izdelani s posebnim razredom navodil. Navzven so podobni standardnim vgrajenim podatkovnim tipom, kot so številke ali zaporedja. Toda v predmetih razreda je pomembna razlika - ohranjanje dedovanja.


Objektno usmerjeno programiranje na Pythonu v celoti temelji na hierarhičnem dedovanju razredov. To je univerzalni način prilagajanja in ponovne uporabe kode. Vendar objektno usmerjen pristop ni obvezen. Python nima težav, ki dovoljujejo samo proceduralno in funkcionalno programiranje. Glavna naloga razredov v Pythonu je podatkovni paket in izvršljiva koda. Sintaktično so podobni izjavi def. Tako kot funkcije, ustvarjajo svoje imenske prostore, ki jih lahko večkrat kličete iz katerega koli dela programa. Zakaj jih potem potrebujejo? Razredi so močnejše in vsestransko orodje. Večino njihovega potenciala razkrivamo v času nastanka novih objektov.

Pomen razredov in načelo dedovanja

Vsak objekt ima svoj imenski prostor, ki ga je mogoče programirati, vnesti spremenljivke inustvarite vse funkcije. Obstajajo tudi atributi, podedovani iz razreda object.attribute. To je pomen OOP-a.


Zaradi dedovanja se ustvari drevo hierarhije. V praksi je to naslednje. Ko tolmač ustreza izrazu object.attribute, začne iskati prvi pojav atributa v podanem razredu. Brez atributa tolmač nadaljuje z iskanjem v vseh sorodnih razredih, ki so v zgornjem drevesu, v smeri od leve proti desni. Drevo iskanja vključuje:
  • superrazrede, ki so na vrhu hierarhije in izvajajo splošno vedenje;
  • podrazredi - so spodaj;
  • kopije - elementi programa z dednim vedenjem.
  • Slika prikazuje drevo razreda Python. Primer kaže, da sta razreda 2 in 3 superrazredi. Na dnu sta dva primerka primerka 1 in 2 v sredini - podrazreda 1. Če pišete izraz Instance2.w, bo prisilil tolmača, da poišče vrednost atributa .w v naslednjem vrstnem redu:
  • instanca2;
  • Razred1;
  • Razred2;
  • Razred3.
  • .w ime bo najdeno v superrazredu razreda 3. Pri OOP terminologiji to pomeni, da je instanca 2 "podedovala" atribut .w za Class3. Upoštevajte, da primerki na sliki podedujejo samo štiri atribute:. je na drevesu, ki je nižje od razreda 2.
  • Za Instance1.y in Instance2.y se atribut .y nahaja v razredu 1, kjer se iskanje ustavi, ker je edino mesto, kjer se pojavi.
  • Za primerke Instance1.z in Instance2.z bo tolmač našel .z Razred 2ker se nahaja na drevesu levo od razreda 3.
  • Za instanco2 bo ime .name atribut najdeno v Instance2 brez iskanja drevesa.
  • Predzadnja točka je najpomembnejša. Prikazuje, kako razred 1 na novo opredeljuje atribut .x in nadomešča različico .x superklasa 2.

    Predmeti, primerki in metode

    . Razredi ustvarjajo nove tipe in predmete razreda v Pythonu so primerki. Na primer, vse celoštevilske spremenljivke pripadajo int. V jeziku OOP so primerki razreda int. Razredi so ustvarjeni z navodili in predmeti s klicanjem. Lahko shranjujejo podatke in imajo lastne funkcije ali razredne metode. Terminologija igra pomembno vlogo v Pythonu. S svojo pomočjo programerji razlikujejo neodvisne funkcije od tistih, ki pripadajo razredom. Spremenljivke, ki se nanašajo na objekte, se imenujejo polja. V PLO obstajata dve vrsti polj. Prva je spremenljivka, ki pripada celotnemu razredu, druga pa spremenljivke posameznih primerov. Polja in metode skupaj so atributi razreda. V Pythonu so zapisani v bloku kode po razredu ključnih besed.

    Metode in vrednosti

    Metode so funkcije z dodatnim lastnim imenom. Doda se na začetek seznama možnosti. Če želite spremenljivko lahko imenujemo drugo ime, vendar takšna pobuda med programerji ni dobrodošla. Self je standard, ki ga je v kodnem imenu lahko prepoznati. Poleg tega so bila nekatera razvojna okolja zasnovana za delo z njim. Da bi bolje razumeli pomen sebe v OOP, si zamislite, da imamo razred z imenom ClassA in metodo A:
  • razred ClassA;
  • def metoda A (self, argument1 argument2).
  • Objekt objekt A je primerek ClassA in klic metode izgleda takole:
  • objectA.methodA (argument1 argument2).
  • Ko tolmač vidi ta korak, se samodejno pretvori na naslednji način: ClassA.methodA (objectA, argument1 argument2). To pomeni, da primerek razreda uporablja samo spremenljivko kot sklic nase.

    Kako ustvariti spremenljivke, metode in primere razredov

    Predlagamo, da se praktični primer razstavi iz interaktivne lupine Python. Ustvarjanje eksperimenta Prvi razred se začne z razredom pouka komponent:
  • razred Eksperiment Najprej:
  • def setinf (self, value): # Metodo najprej ustvarimo z argumenti
  • self.data = vrednost ]
  • def display (self): # druga metoda
  • print (self.data) # podatki za kopiranje.
  • Po obveznem umiku je blok z zaprtimi navodili def, v katerem so objektnim objektom dodeljena imena setinf in display. Z njihovo pomočjo se ustvarijo atributi ExperimentPrivy.setinf in ExperimentPrivy.display. Vsako ime, ki dodeli vrednost najvišji ravni v ugnezdenem bloku, postane atribut. Da bi videli, kako metode delujejo, morate ustvariti dve primerki:
  • x = Experiment First () # Ustvarjeni sta dve kopiji;
  • y = ExperimentPerfect () # Vsak je ločen imenski prostor.
  • Na začetku vzorci ne shranjujejo nobenih podatkov in so popolnoma prazni. Vendar so povezani z njihovim razredom:
  • x.setinf ("Teach Python") # Pokliči metodo, v kateri self-x.
  • y.setinf (314) # Ekvivalent: prvi poskus .setinf (y, 314)
  • Če uporabljate ime primerkax, y se nanašajo na atribut objekta .setinf razreda razredov Experiment, nato pa interpreter vrne vrednost atributa razreda kot rezultat iskanja drevesa dedovanja.
  • x.display () # V x in y vaše vrednosti self.data
  • Teach Python
  • y.display ()
  • 314.
  • )

    Preobremenitveni operaterji

    V Pythonu lahko razredi prenašajo operaterje izjav. S to možnostjo so kopije podobne vgrajenim podatkovnim tipom. Postopek je izvajanje metod s posebnimi imeni, ki se začnejo in končajo z dvojnim poudarjanjem. Razmislite o dejanju __init__ in __sub__. Prva metoda se imenuje konstruktor razreda. V Pythonu __init__ izvede operacijo ustvarjanja preobremenitvene kopije. Druga metoda __sub__ izvaja operacijo odštevanja.
  • class load: # ustvarja nov razred
  • def __init __ (self, start):
  • self.data = start
  • def __sub __ (self, other): # copy minus other
  • return Preobremenitev (self.data - drugo) # Rezultat bo nov primer
  • A = preobremenitev

    #__ init __ (A, 10)

  • B = A - 2 #__ sub __ (B, 2)
  • B. Podatki #B je nov primer razreda preobremenitve
  • 8.
  • Več o metodi __init__

    Metoda __init__ najpogosteje se uporablja pri delu z razredi. Nepogrešljiv je za inicializacijo različnih predmetov. __init__ kliče ločeno. Pri ustvarjanju novega primerka metoda samodejno prejme argumente, navedene v oklepajih. Pri metodah preobremenitve lahko izvedete vse operacije z vgrajenimi podatkovnimi tipi. Večina se uporablja samo pri reševanju posebnih nalog, pri katerih je potrebno objektomsimulira obnašanje standardnih objektov. Metode so podedovane od nadrazredov in niso obvezne. V začetnih fazah je enostavno brez njih. Za popolno potopitev v programiranje in bistvo PLO-ja potrebujete veščine dela z operaterji.

    __getitem__ metoda

    Metoda __getitem__ premaga dostop do elementa indeksa. Če je podedovana ali je prisotna v definiciji razreda, bo indekser za vsako operacijo samodejno poklical. Na primer, ko se v izrazu prikaže primerek F za ekstrahiranje elementa z indeksom, kot je F [i], Pythonov tolmač kliče metodo __getitem__, pri čemer predmet F v prvem argumentu indeksira, v drugem pa je naveden v oglatih oklepajih. Naslednji razred "ExampleIndexation" vrne kvadrat vrednosti indeksa:
  • razred Primer:
  • def __getitem __ (self, index):
  • indeks povratka ** 2
  • F = PrimerIndexation ()
  • F
  • # Izraz F [i] kliče F .__ getitem __ (i)
  • 4
  • za i v območju
    :
  • 76) print (F [i], end = "") # Vzroki __getitem __ (F, i) v vsaki ponovitvi
  • 014 916
  • S to metodo lahko izvedete operacijo odrezka, ki se pogosto uporablja med delom s sekvencami. Pri obdelavi seznamov je standardna skladnja operacije naslednja:
  • Seznam = [13, 6, "in", "c", 74.9]
  • Seznam [2: 4]
  • [6, «in», «c», 74.9]
  • Seznam [: 1]
  • [13, 6, «in», «c»]
  • Seznam [:: 2]
  • [13, «in«, 74.9)
  • Razred, ki izvaja metodo __getitem__:
  • razred Indexer:
  • moj seznam = [13,6] "
  • def __getitem__ (self, index): # Pokliče, koIndeksiranje ali ekstrahiranje reza
  • print ("getitem:", index)
  • return self.my_list [index] # Izvaja indeksiranje ali izvlečke reza
  • X = Indexer () 92]
  • X# Ko indeksiranje __getitem__ prejme celo število
  • getitem: 0
  • 13
  • X [2: 4] # Pri pridobivanju reza __getitem__ prejme predmet reza
  • getitem: rezina (2 4 Brez)
  • ["in", "c"]
  • Pritožba na atribute

    Za sklicevanje na atribut se uporablja posebna metoda __getattr__. Kliče se z imenom atributa v obliki vrstice v primeru identifikacije poskusa pridobitve sklica na neobstoječi ali nedoločen atribut. Ko tolmač lahko zazna želeni predmet v drevesu dedovanja, __getattr __. Metoda je primerna za posplošeno obdelavo zahtev za atribute:
  • razred Gone:
  • def __getattr __ (self, atname):
  • če atname == "age":
  • return
  • drugo:
  • dvig AttributeError, atname
  • D = Gone ()
  • D. starost
  • 20
  • 112) D. ime
  • AttributeError: name
  • Gone razred in njegova kopija D nimajo atributov. Zato, ko kličete k starosti D., se metoda __getattr__ samodejno prikliče. Sama kopija se prenaša kot samostojno in ime nedoločene "starosti" v vrstici atname. Razred vrne rezultat zadetka na starostno ime D., čeprav nima tega atributa. Če razred ne pričakuje, da bo atribut obdelan, metoda __getattr__ pokliče vdelano izjemo in tako posreduje informacijam tolmača, da je ime dejansko negotovo. V tem primeru poskus sklica na ime D. vodi do napake. Metoda deluje na podoben načinPreobremenitev operatorjev __setattr__, prestrezanje vsakega poskusa dodelitve vrednosti atributov. Če je ta metoda napisana v telesu razreda, bo izraz "self.attitude = value" pretvorjen v klic metode self .__ setattr _ ("atribut", vrednost). Opisali smo le nekaj obstoječih metod preobremenitve. Celoten seznam je v standardnem jezikovnem vodniku in vsebuje veliko več imen.

    Dodatne funkcije

    OOP-ji se včasih uporabljajo za kompleksne in nestandardne naloge. Zahvaljujoč dedovanju razredov v Pythonu se obnašanje vgrajenih podatkovnih tipov in njihovih zmožnosti razširi in prilagodi. Če niste zadovoljni z dejstvom, da se indeksiranje v zaporedjih začne iz nič, ga lahko popravite s pomočjo razrednih navodil. To naredite tako, da ustvarite podrazred seznama tipov z novimi imeni vseh vrst in izvedete potrebne spremembe. Tudi v PLO v jeziku Python obstajajo dekoraterji funkcij, statične metode in mnoge druge kompleksne in posebne tehnike.

    Sorodne publikacije