Objektno orijentirano programiranje u Pythonu: klase, opis i značajke
U Pythonu su klasi temeljni koncept. To je temelj standardne knjižnice, djela najpopularnijih programa i samog jezika. Ako želite postati više od početnika programera, morate shvatiti bit i načelo rada s klasama i predmetima.
sadržaj
Što su klase
Ovo je osnovna softverska komponenta OOP-a. U Pythonu se klase koriste za implementaciju novih vrsta objekata i izrađuju se pomoću posebne nastave klase. Izvana, oni nalikuju standardnim ugrađenim vrstama podataka, kao što su brojevi ili sekvence. Ali klasni objekti imaju značajnu razliku - potpora nasljeđu.
Objektno orijentirano programiranje u Pythonu se potpuno temelji na hijerarhijskoj nasljednosti nastave. Ovo je univerzalni način prilagodbe i ponovnog korištenja koda. No objektno orijentirani pristup nije obvezan. Python omogućuje samo proceduralno i funkcionalno programiranje bez problema.
Glavni zadatak nastave u Pythonu je pakiranje podataka i izvršni kod. Oni su sintaktički isti kao i def definira. Poput funkcija, oni stvaraju vlastite prostore, koji se mogu pozivati više puta od bilo kojeg dijela programa. Zašto su onda potrebni? Nastava su moćniji i svestrani alat. Prije svega, njihov potencijal se otkriva kada se stvaraju novi objekti.
Važnost klasa i načelo baštine
Svaki novi objekt ima svoj vlastiti prostor, koji možete programirati, unijeti varijable i stvoriti sve funkcije. I također postoje atributi naslijeđeni iz klase: object.attribute. Ovo je značenje OOP-a.
Zahvaljujući nasljeđivanju, stvara se hijerarhijsko stablo. U praksi to izgleda ovako. Kada prevoditelj susreće izraz object.attribute, počinje tražiti prvo pojavljivanje atributa u navedenoj klasi. Bez otkrivanja atributa, tumač i dalje traži sve povezane klase na gornjem stablu, s lijeva na desno.
Stablo za pretraživanje uključuje:
- Superclasses koji su na samom vrhu hijerarhije i provode zajedničko ponašanje;
- podrazredi - dolje su;
- slučajevi su elementi programa s naslijeđenim ponašanjem.
Slika prikazuje stablo Python klase. Iz primjera vidimo da su klase 2 i 3 superklase. Na samom dnu nalaze se dvije instance instance 1 i 2, u sredini - podrazred klase 1. Ako napišete izraz Instance2.w, to će uzrokovati da tumač traži vrijednost atributa .w u sljedećem redoslijedu:
- instance2;
- Class1;
- Klasa 2;
- Class3.
Naziv .w nalazit će se u superclassu klase 3. U OOP terminologiji to znači da instanca 2 "nasljeđuje" .w atribut iz klase3.
Napominjemo da primjeri na slici nasljeđuju samo četiri atributa: .w, .x, .y i .z:
- Za instanca instance1.x i Instance2.x, atx. X će se naći u klasi 1, gdje će se pretraživanje zaustaviti jer je klasa 1 u stablu niža od klase 2.
- Za instance1.y i Instance2.y, atribut .y bit će pronađen u klasi 1, pri čemu će se pretraživanje zaustaviti jer je to jedino mjesto na kojem se pojavljuje.
- Za instance Instance1.z i Instance2.z, prevoditelj će pronaći .z u klasi 2, jer se nalazi na stablu lijevo od klase 3.
- Za instance2.name, atenom će se naći u instance2 bez traženja stabla.
Prethodna stavka je najvažnija. Prikazuje kako klasa 1 nadjačava atribut .x, zamjenjujući verziju .x verzije klase za razred 2.
Objekti, primjeri i metode
OOP djeluje s dva glavna pojma: klase i predmete. Razredi stvaraju nove tipove, a objekti klase u Pythonu su njihovi primjeri. Na primjer, sve integer varijable odnose se na ugrađenu vrstu podataka int. U OOP jeziku, oni su slučajevi klase int.
Klase su izrađene prema uputama, a objekti se stvaraju pomoću poziva. Mogu pohraniti podatke i imati svoje funkcionalnosti ili metode klase. U Pythonu, terminologija igra važnu ulogu. Uz pomoć, programeri razlikuju neovisne funkcije od onih koji pripadaju razredima. Varijable povezane s objektima nazivaju se polja.
Postoje dvije vrste polja u OOP. Prvo su varijable koje pripadaju cijelu klasu, druga su varijable pojedinih instanci. Polja i metode zajedno su atributi klase. U Pythonu su zapisani u bloku koda nakon klase ključnih riječi.
Metode i značenje sebe
Metode su funkcije s dodatnim imenom. Dodaje se na vrh popisa parametara. Ako želite, varijablu se može nazvati drugačije ime, ali takva inicijativa među programerima nije dobrodošla. Jastvo je uobičajeno, lako prepoznatljivo ime u kodu. Štoviše, neke razvojne okoline su dizajnirane za rad s njom.
Da bismo bolje razumjeli vrijednost sebe u OOP, zamislite da imamo klasu nazvanu ClassA i methodA:
- > klasa ClassA;
- def metodaA (self, argument1, argument2).
ObjektA je primjer klase A, a metoda poziva izgleda ovako:
- > objectA.methodA (argument1, argument2).
Kada prevoditelj vidi ovu liniju, automatski ga pretvara kao na sljedeći način: ClassA.methodA (objectA, argument1, argument2). To jest, instanca klase koristi varijablu sebe kao referencu na sebe.
Kako izraditi varijable, metode i primjere klasa
Nudimo rastavljanje praktičnog primjera iz interaktivne ljuske Python. Stvaranje klase "Eksperiment prve" započinje spojem klase izjave:
- > klasa Prvo eksperiment:
- def setinf (self, value): # izradite prvu metodu s argumentima
- self.data = vrijednost
- def prikaz (samo): # druga metoda
- ispis (self.data) # ispis podataka o primjeru.
Nakon obaveznog uvlačenja slijedi blok s ugrađenim def uputama, u kojima su dodijeljena dva funkcijska objekta imena i postavke naziva. Pomoću njih izrađuju se atributi Experiment First.setinf i Experiment First.display. U stvari, bilo koje ime kojemu je dodana vrijednost na najvišoj razini u ugniježđenom bloku, postaje atribut.
Da biste vidjeli kako metode funkcioniraju, morate izraditi dva slučaja:
- > x = Prvo eksperiment () # Kreiraju se dva primjerka;
- > y = Prvo eksperiment () # Svaki od njih je zaseban nazivni prostor.
U početku slučajevi ne pohranjuju nikakve podatke i potpuno su prazni. Ali oni su povezani s njihovom klasom:
- > x.setinf ("Učenje Python") # Pozivanje načina na koji je samouprave x.
- > y.setinf (3.14) # Ekvivalent: Eksperiment Prvi.setinf (y, 3.14)
Ako se kroz naziv instance x, y odnosi na atribut .setinf objekta Experiment First, tumač vraća vrijednost atributa klase kao rezultat pretraživanja stabla nasljeđivanja.
- > x.display () # xi y imaju vlastite vrijednosti self.data
- Saznajte za Python
- > y.display ()
- 3.14.
Preopterećenje operatera
U Pythonu klase mogu preopteretiti izražavanje izraza. Ova sposobnost čini primjerima sličnim ugrađenim vrstama podataka. Proces se sastoji od primjene metoda s posebnim nazivima koji započinju i završavaju dvostrukim naglascima.
Razmotrite u akciji __init__ i __sub__. Prva metoda se naziva klasni konstruktor. U Pythonu, __init__ izvršava preopterećenje na radnji izrade instalacije. Druga metoda __sub__ provodi operaciju oduzimanja.
- > klasa Preopterećenje: # stvara novu klasu
- def __init __ (sam, početak):
- self.data = početak
- def __sub __ (samouprave, ostalo): # instance minus other
- povratak Preopterećenje (self.data - drugo) # Rezultat je nova instanca
- > A = preopterećenje (10) #__ init __ (A, 10)
- > B = A - 2 #__ pod __ (B, 2)
- > B.data # B je nova instanca razreda preopterećenja
- 8.
Više o metodi __init__
Metoda __init__ najčešće se koristi pri radu s klasama. To je neophodno za inicijalizaciju raznih objekata. __init__ ne mora biti pozvan odvojeno. Kada se stvori nova instanca, metoda automatski prima argumente navedene u zagradama.
Pomoću načina preopterećenja možete provesti sve operacije s ugrađenim vrstama podataka. Većina se koristi samo pri rješavanju posebnih zadataka u kojima je potrebno da objekti oponašaju ponašanje standardnih objekata.
Metode su naslijeđene od superklasama i nisu obavezne. U početnim fazama jednostavno možete bez njih. No, za potpuni uranjanje u programiranje i suštinu OOP-a, morate raditi s operatorima.
__getitem__ metoda
Metoda __getitem__ obavlja preopterećenje pristupa elementu na indeksu. Ako je naslijeđen ili prisutan u definiciji klase, tumač će to automatski nazvati za svaku indeksiranu operaciju. Na primjer, kada se primjer F pojavljuje u izrazu za pronalaženje elementa na indeksu, kao što je F [i], Python tumač naziva metodu __getitem__, prenosi objekt F u prvi argument i indeks naveden u kvadratne zagrade, u drugom.
Sljedeća tablica "Indeksni indeks" vraća trg vrijednosti indeksa:
- > class SampleIndexation:
- def __getitem __ (samo, indeks):
- indeks povratka ** 2
- > F = Primjer indeksiranja ()
- > F [2] # Izraz F [i] poziva F .__ getitem __ (i)
- 4
- > za i u dometu (5):
- print (F [i], kraj = "") # Pozivi __getitem __ (F, i) u svakoj iteraciji
- 0 1 4 9 16
S istom metodom možete izvesti operaciju ekstrakcije kriška, koja se često koristi pri radnji s nizom. Prilikom obrade popisa standardna sintaksa za rad je sljedeća:
- > Popis = [13, 6, «i», «sa», 74,9]
- > Popis [2: 4]
- ["I", "c"]
- > Popis [1:]
- [6, "i", "c", 74,9]
- > Popis [: - 1]
- [13, 6, "i", "c"]
- > Popis [:: 2]
- [13, "i", 74,9]
Klasa koja provodi metodu __getitem__:
- > klasni indeks:
- my_list = [13, 6, «i», «sa», 74,9]
- def __getitem __ (samo, indeks): # Nazvan kada indeksira ili važi krišku
- print ("getitem:", indeks)
- povratak self.my list [index] # Izvršava indeksiranje ili izvlači krišku
- > X = indeks ()
- > X [0] # Kod indeksiranja, __getitem__ dobiva cijeli broj
- getitem: 0
- 13
- > X [2: 4] # Kad ekstrahirajte krišku, __getitem__ prima objekt odsječka
- getitem: kriška (2, 4, nema)
- ["I", "c"]
Pristup atributima
Da biste dobili referencu na atribut, upotrijebite posebnu metodu __getattr__. Naziva se imenom atributa u obliku niza u slučajevima otkrivanja pokušaja da se dobije referenca na nepostojeći ili nedefinirani atribut. Kada prevoditelj može pronaći željeni objekt u stablu nasljeđivanja, __getattr __. Nije pozvan.
Metoda je prikladna za opću obradu zahtjeva za atributima:
- > klasa Otišla:
- def __getattr __ (ja, atname):
- ako atname == "dob":
- povrat 20
- drugo:
- povisiti vrijednost AttributeError, atname
- > D = otišao ()
- > D.age
- 20
- > D.name
- AttributeError: ime
Gone klasa i njezin primjer D nemaju vlastite atribute. Stoga, prilikom pristupanja Dage, automatski se poziva __getattr__ metoda. Sama instanca prolazi kao samouprave, ali naziv nedefiniranog "doba" u nizu atname. Klasa vraća rezultat pristupa nazivu D.age, unatoč činjenici da nema takav atribut.
Ako klasa ne predviđa rukovanje atributom, metoda __getattr__ zove ugrađenu iznimku, i time prenosi informacije tumaču da je ime zapravo nedefinirano. U tom slučaju, pokušaj pristupa nazivu D.name rezultiralo je pogreškom.
Metoda __setattr__ operatora preopterećenja radi na sličan način, presrećući svaki pokušaj dodjeljivanja atributne vrijednosti. Ako je ova metoda registrirana u tijelu klase, izraz "self.attribute = value" pretvorit će se u poziv na metodu self .__ setattr _ ("atribut", vrijednost).
Opisali smo samo nekoliko postojećih metoda preopterećenja. Cjelokupni popis nalazi se u standardnom vodiču jezika i uključuje mnogo više imena.
Dodatne značajke
OOP se ponekad koristi za složene i nestandardne zadatke. Naslijedivši klase u Pythenu, ponašanje ugrađenih tipova podataka i njihovih sposobnosti je pogodno za širenje i prilagodbu.
Ako niste zadovoljni činjenicom da indeksiranje u nizu počinje ispočetka, možete ga popraviti pomoću izjave klase. Da biste to učinili, izradite podrazred vrste popisa s novim nazivima svih vrsta i provedite potrebne izmjene. Također u OOP-u u Pythonu postoje funkcionalni dekoratori, statičke metode i mnoge druge složene i posebne tehnike.
- Objektno orijentirano programiranje
- Što je to encapsulation? Inkapsuliranje u programiranju
- Što je OOP? Osnovni principi objektno orijentiranog programiranja
- Programiranje igara: programi, značajke stvaranja i preporuke
- Python programski jezik: petlje
- PHP konstrukt: stvaranje primjeraka klase
- Skriptni programski jezici: zadaci, značajke i prednosti
- Rekurzivni algoritam: opis, analiza, značajke i primjeri
- Što je proceduralno programiranje?
- Programiranje u Pythonu: Popis
- Ulaz i izlaz u Pythonu. Ulaz i ispis
- Programiranje u Pythonu. Rad s žicama
- Kako mogu pronaći ostatak podjele u Pythonu?
- Python: vrste podataka, uvjeti, zahtjevi i primjeri
- Funkcije u Pythonu: def. Python 3 za početnike
- Što su objekti u Pythonu?
- Rad s objektima datoteka: otvaranje, čitanje i pisanje datotekama u Pythonu
- Uvjetne izjave ako / drugo u Pythonu: sintaksa i primjena
- Standardne C ++ knjižnice
- Sintaksa jаvascript parseInt: primjeri upotrebe
- Sintaksa jаvascript parseInt: primjeri upotrebe