Objektno-orijentirano programiranje na Pythonu: Klase, opis i značajke

Pythonove klase su temeljni pojam. To je temelj standardne knjižnice, rada najpopularnijih programa i samog jezika. Ako želite postati više od programera početnika, morate razumjeti bit i načelo rada s klasama i objektima.

Koje su klase

Ovo je osnovna programska komponenta PLO-a. U Python klasama se koriste za implementaciju novih tipova objekata i kreiraju se pomoću posebne klase instrukcija. Izvana, oni nalikuju standardnim ugrađenim tipovima podataka, kao što su brojevi ili sekvence. No, u objektima klase postoji značajna razlika - održavanje nasljedstva.


Objektno orijentirano programiranje na Pythonu u cijelosti se temelji na hijerarhijskom nasljeđivanju klasa. To je univerzalan način prilagođavanja i ponovnog korištenja koda. Ali objektno orijentirani pristup nije obavezan. Python nema problema dopuštajući samo proceduralno i funkcionalno programiranje. Glavni zadatak klasa u Pythonu je paket podataka i izvršni kod. Sintaktički su slični izrazu def. Kao i funkcije, one kreiraju svoje prostore imena, koje se mogu višekratno pozivati ​​iz bilo kojeg dijela programa. Zašto ih onda trebaju? Nastava je snažniji i raznovrsniji alat. Većina njihovih potencijala otkriva se u vrijeme stvaranja novih objekata.

Važnost klasa i načelo nasljeđivanja

Svaki objekt ima svoj vlastiti imenski prostor koji se može programirati, unositi varijable istvoriti sve funkcije. Postoje i atributi naslijeđeni od objekta class.attribute. To je značenje OOP-a.


Zahvaljujući nasljeđivanju stvoreno je stablo hijerarhije. U praksi, to je kako slijedi. Kada interpreter susretne izraz object.attribute, on počinje tražiti prvu pojavu atributa u navedenoj klasi. Bez atributa, tumač nastavlja tražiti u svim srodnim klasama koje su na stablu iznad, u smjeru lijevo-desno. Stablo pretraživanja uključuje:
  • superklase koje su na vrhu hijerarhije i provode opće ponašanje;
  • podklasa - su niže;
  • kopije - elementi programa s naslijeđenim ponašanjem.
  • Slika prikazuje stablo klase Python. Primjer pokazuje da su klase 2 i 3 nadklasa. Na dnu su dva primjera instance 1 i 2 u sredini - klasa klase 1. Ako napišete izraz Instance2.w, prisilit će interpretera da traži vrijednost atributa .w u sljedećem redoslijedu:
  • Instance2;
  • Klasa1;
  • Klasa 2;
  • Klasa3.
  • .w ime će se naći u klasi 3 superklase. Na OOP terminologiji, to znači da instanca 2 "nasljeđuje" .w atribut Class3. Primijetite da instance na slici nasljeđuju samo četiri atributa: .w, .x, .y.z:
  • Za primjere Instance1.x i Instance2.x, .x atribut će se naći u klasi 1 gdje je pretraživanje zaustavljeno, jer klasa 1 je na drvetu nižem od klase 2.
  • Za Instance1.y i Instance2.y atribut .y nalazi se u razredu 1 gdje će se pretraživanje zaustaviti jer je to jedino mjesto gdje se pojavljuje.
  • Za slučajeve Instance1.z i Instance2.z, tumač će pronaći .z Razred 2jer se nalazi na stablu lijevo od klase 3.
  • Za Instance2, atribut name .name će se naći u Instance2 bez traženja stabla.
  • Predzadnja točka je najvažnija. Pokazuje kako razred 1 redefinira atribut .x, zamjenjujući .x verziju nadklasa 2.

    Objekti, instance i metode

    . Klase stvaraju nove tipove, a objekti klasa u Pythonu su njihove instance. Na primjer, sve cjelobrojne varijable pripadaju int. U jeziku OOP-a to su primjeri int klase. Klase se stvaraju prema uputama i objektima pozivima. Mogu pohraniti podatke i imati vlastite funkcije ili metode klasa. Terminologija igra važnu ulogu u Pythonu. Uz njegovu pomoć, programeri razlikuju nezavisne funkcije od onih koje pripadaju razredima. Varijable koje se odnose na objekte nazivaju se polja. Postoje dva tipa polja u PLO-u. Prva je varijabla koja pripada cijelom razredu, druga varijable pojedinih instanci. Polja i metode zajedno su atributi klase. U Pythonu, oni su zapisani u blok koda nakon klase ključne riječi.

    Metode i vrijednosti

    Metode su funkcije s dodatnim vlastitim imenom. Dodaje se na početak popisa opcija. Ako želite varijablu može se nazvati drugačije ime, ali takva inicijativa među programerima nije dobrodošla. Jastvo je standard koji se lako prepoznaje u kodnom imenu. Štoviše, neka razvojna okruženja su dizajnirana da rade s njim. Da bi bolje razumjeli značenje sebe u OOP-u, zamislite da imamo klasu nazvanu ClassA i metodu A:
  • klasa ClassA;
  • def metodaA (self, argument1 argument2). Objekt objekt A je instanca ClassA i poziv metode izgleda ovako:
  • objectA.methodA (argument1 argument2).
  • Kada tumač vidi ovaj korak, automatski se pretvara na sljedeći način: ClassA.methodA (objectA, argument1 argument2). To znači da instanca klase koristi samo varijablu kao referencu na sebe.

    Kako stvoriti varijable, metode i primjere klasa

    Predlažemo rastavljanje praktičnog primjera iz Python interaktivne ljuske. Stvaranje eksperimenta Prva klasa započinje razredom instrukcija za komponentu:
  • klasa Eksperiment Prvo:
  • def setinf (self, value): # prvo kreiramo metodu s argumentima
  • self.data = vrijednost
  • ]
  • def display (self): # druga metoda
  • ispis (self.data) # ispis kopiranih podataka.
  • Nakon obaveznog povlačenja, postoji blok s priloženim uputama def, u kojem objektnim objektima se dodjeljuju imena setinf i display. Uz njihovu pomoć, stvaraju se atributi ExperimentPrivy.setinf i ExperimentPrivy.display. U stvari, svako ime koje dodjeljuje vrijednost najvišoj razini u ugniježđenom bloku postaje atribut. Da biste vidjeli kako funkcioniraju metode, morate stvoriti dvije instance:
  • x = Experiment First () # Stvorene su dvije kopije;
  • y = ExperimentPerfect () # Svaki je zasebni prostor imena. U početku, uzorci ne pohranjuju nikakve podatke i potpuno su prazni. Ali oni su povezani s njihovom klasom:
  • x.setinf ("Teach Python") # Nazovite metodu u kojoj self-x.
  • y.setinf (314) # Ekvivalent: prvi eksperiment .setinf (y, 314)
  • Ako koristite ime instancex, y odnose se na atribut .setinf objekta klase klase Experiment, a interpretator vraća vrijednost atributa klase kao rezultat pretraživanja stabla nasljeđivanja.
  • x.display () # U x i y Vašim vrijednostima self.data
  • Podučavajte Python
  • y.display ()
  • 314.
  • )

    Preopterećenje operatora

    U Pythonu, klase mogu preopteretiti operatore izraza. Ova opcija čini kopije slične ugrađenim tipovima podataka. Proces je implementacija metoda s posebnim imenima koja počinju i završavaju dvostrukim podcrtavanjem. Razmotrite u akciji __init__ i __sub__. Prva metoda se naziva konstruktor klase. U Pythonu __init__ izvodi operaciju stvaranja kopije preopterećenja. Druga metoda __sub__ implementira operaciju oduzimanja.
  • class load: # stvara novu klasu
  • def __init __ (self, start):
  • self.data = start
  • def __sub __ (self, other): # copy minus other
  • return Preopterećenje (self.data - ostalo) # Rezultat će biti nova instanca
  • A = Preopterećenje

    #__ init __ (A, 10)

  • B = A - 2 #__ sub __ (B, 2)
  • B. podaci #B je nova instanca klase preopterećenja
  • 8.
  • Više o metodi __init__

    Metoda __init__ najčešće se koristi pri radu s razredima. Neophodan je za inicijalizaciju različitih objekata. __init__ poziva odvojeno. Kada stvarate novu instancu, metoda automatski prima argumente navedene u zagradama. S metodama preopterećenja, možete implementirati sve operacije s ugrađenim tipovima podataka. Većina se koristi samo pri rješavanju posebnih zadataka u kojima je potrebno objektimaoponašajući ponašanje standardnih objekata. Metode naslijedio od superklassov i nisu obvezujući. U početnim fazama, možete lako učiniti bez njih. No, za punu uranjanjem u prirodi programiranje i OOP zahtijeva radno znanje operatera.

    Postupak __getitem__

    Postupak obavlja preopterećenje __getitem__ pristup element indeksa. Ako je naslijeđena ili prisutne u definiciji klase, tada je indeksirano svaka transakcija tumač će ga automatski nazvati. Na primjer, kada kopija F pojavljuje u ekspresijski ekstrakciju elementa s indeksom kao F [I], je Python interpreter __getitem__ način, predmet F prođe prvi argument indeks naveden u zagradama u drugi. Sljedeća klasa "PrymerYndeksatsyy" vraća kvadrat indeksa:
  • razred PrymerYndeksatsyy
  • def __getitem __ (ja, indeks):
  • indeks povratak ** 2
  • F = PrymerYndeksatsyy ()
  • F
  • # ekspresija F [i] je F .__ getitem __ (i)
  • 4
  • za i u području
    ,
  • ispis (kraj F [i] = «») # to je __getitem __ (F, i) u svakoj iteraciji
  • 014 916
  • S ovom metodom, možete izvesti operaciju vađenja rez, koji se često koristi kada se radi s sekvencama. Prilikom obrade popisa standardnih transakcija sintaksa je kako slijedi:
  • Popis = [13, 6 "a", "c", 74,9]
  • Popis
  • [2: 4]
  • ["a", "c"]
  • Popis [1:]
  • [6, "a", "c", 74,9]
  • Popis [: 1]
  • [13, 6, "a", "c"]
  • Popis [:: 2]
  • [13 "i" 74,9 ]
  • klase koji implementira metodu __getitem__:
  • Indexer klase
  • = moy_spysok [13, 6 "a", "c", 74,9]
  • def __getitem__ (samo, indeks): # zove kadIndeksiranje ili vađenje reza
  • print ("getitem:", index)
  • return self.my_list [index] # Obavlja indeksiranje ili izvlači rez
  • X = Indexer () 92]
  • X# Kada indeksiranje __getitem__ prima cijeli broj
  • getitem: 0
  • 13
  • X [2: 4] # Kada izvlači rez __getitem__ prima predmet rezanja
  • getitem: slice (2 4 None)
  • ["i", "c"]
  • Pozivanje na atribute

    Posebna metoda __getattr__ koristi se za upućivanje na atribut. Naziva se s imenom atributa u obliku retka u slučaju identificiranja pokušaja da se dobije referenca na nepostojeći ili neodređeni atribut. Kada tumač može otkriti željeni objekt u stablu nasljeđivanja, __getattr __. Metoda je prikladna za generaliziranu obradu zahtjeva za atribute:
  • klasa Gone:
  • def __getattr __ (self, atname):
  • ako je atname == "age":
  • povratak 20
  • drugo:
  • podizanje AtributaIzgoda, atname
  • D = Gone ()
  • D. age
  • 20
  • 112) D. name
  • AttributeError: name
  • Prošli razred i njegova kopija D nemaju atribute. Stoga, kada zovete na D. age, automatski se poziva metoda __getattr__. Sama kopija se prenosi kao self, a ime neodređenog "starosti" u liniji atname. Klasa vraća rezultat pogotka na ime starosti D., unatoč činjenici da nema ovaj atribut. Ako klasa ne očekuje da će se atribut obraditi, metoda __getattr__ poziva ugradenu iznimku i tako prosljeđuje informacijama tumača da je ime zapravo neizvjesno. U ovom slučaju, pokušaj upućivanja na ime D. dovodi do pogreške. Metoda djeluje na sličan načinPreopterećenje operatora __setattr__, presretanje svakog pokušaja dodjeljivanja vrijednosti atributa. Ako je ova metoda napisana u tijelu klase, izraz "self.attitude = value" će se pretvoriti u poziv metode self .__ setattr _ ("atribut", vrijednost). Opisali smo samo neke od postojećih metoda preopterećenja. Cijeli je popis u standardnom jezičnom vodiču i sadrži mnogo više imena.

    Dodatne značajke

    OOP-ovi se ponekad koriste za složene i nestandardne zadatke. Zahvaljujući nasljeđivanju klasa u Pythonu, ponašanje ugrađenih tipova podataka i njihovih mogućnosti proširuju se i prilagođavaju. Ako niste zadovoljni činjenicom da indeksiranje u sekvencama počinje od nule, možete ga ispraviti pomoću instrukcija razreda. Da biste to učinili, morate stvoriti potklasu popisa tipova s ​​novim imenima svih vrsta i provesti potrebne promjene. Također, u PLO-u na jeziku Python postoje dekoratori funkcija, statičke metode i mnoge druge složene i posebne tehnike.

    Povezane publikacije