Pythoni klassid ja objektid (koos näidetega)

Selles õpetuses saate teada Pythoni objektide ja klasside põhifunktsionaalsusest. Saate teada, mis on klass, kuidas seda luua ja oma programmis kasutada.

Video: Pythoni klassid ja objektid

Pythoni objektid ja klassid

Python on objektile orienteeritud programmeerimiskeel. Erinevalt protseduurile orienteeritud programmeerimisest, kus põhirõhk on funktsioonidel, on objektile suunatud programmeerimine objektidele rõhuasetus.

Objekt on lihtsalt andmete (muutujate) ja meetodite (funktsioonide) kogum, mis nende andmetega toimib. Samamoodi on klass selle objekti kavand.

Klassist võime mõelda kui maja visandist (prototüübist). See sisaldab kõiki üksikasju põrandate, uste, akende jms kohta. Nende kirjelduste põhjal ehitame maja. Maja on objekt.

Kuna palju maju saab teha maja kavandist, saame klassist luua palju esemeid. Objekti nimetatakse ka klassi eksemplariks ja selle objekti loomise protsessi nimetatakse kiireks .

Klassi määratlemine Pythonis

Nagu funktsioonide definitsioonid algavad Pythonis def märksõnaga, algavad klassi definitsioonid klassi märksõnaga.

Klassi esimest stringi nimetatakse dokstringiks ja sellel on klassi kohta lühike kirjeldus. Kuigi see pole kohustuslik, on see siiski väga soovitatav.

Siin on lihtne klassi määratlus.

 class MyNewClass: '''This is a docstring. I have created a new class''' pass

Klass loob uue kohaliku nimeruumi, kus kõik selle atribuudid on määratletud. Atribuudid võivad olla andmed või funktsioonid.

Selles on ka spetsiaalsed atribuudid, mis algavad topeltjoonistustega __. Näiteks __doc__annab meile selle klassi õpetuse.

Niipea kui oleme klassi määratlenud, luuakse sama nimega uus klassiobjekt. See klassiobjekt võimaldab meil pääseda juurde nii erinevatele atribuutidele kui ka selle klassi uutele objektidele.

 class Person: "This is a person class" age = 10 def greet(self): print('Hello') # Output: 10 print(Person.age) # Output: print(Person.greet) # Output: 'This is my second class' print(Person.__doc__)

Väljund

 10 See on inimese klass

Objekti loomine Pythonis

Nägime, et klassi objekti saab kasutada erinevatele atribuutidele juurdepääsemiseks.

Seda saab kasutada ka selle klassi uute objektide (eksemplaride) loomiseks. Objekti loomise protseduur sarnaneb funktsioonikutsega.

 >>> harry = Person()

See loob uue objektieksemplari nimega harry. Objektide atribuutidele pääseme juurde, kasutades objektinime prefiksit.

Atribuudid võivad olla andmed või meetod. Objekti meetodid on selle klassi vastavad funktsioonid.

See tähendab, et kuna Person.greetsee on funktsiooni objekt (klassi atribuut), Person.greeton see meetod objekt.

 class Person: "This is a person class" age = 10 def greet(self): print('Hello') # create a new object of Person class harry = Person() # Output: print(Person.greet) # Output:  print(harry.greet) # Calling object's greet() method # Output: Hello harry.greet() 

Väljund

  Tere 

Võib-olla olete märganud selfparameetrit funktsiooni määratluses klassi sees, kuid me kutsusime meetodit lihtsalt nagu harry.greet()ilma igasuguste argumentideta. See ikka toimis.

Seda seetõttu, et alati, kui objekt kutsub oma meetodit, edastatakse objekt ise esimese argumendina. Niisiis, harry.greet()tõlgib Person.greet(harry).

Üldiselt on n-i argumendiloendiga meetodi kutsumine samaväärne vastava funktsiooni kutsumisega argumendiloendiga, mis on loodud meetodi objekti sisestamisel enne esimest argumenti.

Nendel põhjustel peab funktsiooni klassis esimene argument olema objekt ise. Seda nimetatakse tavapäraselt iseendaks. Selle võib nimetada teisiti, kuid soovitame tungivalt konventsiooni järgida.

Nüüd peate tundma klassiobjekti, eksemplariobjekti, funktsiooniobjekti, meetodobjekti ja nende erinevusi.

Ehitajad Pythonis

Topeltkriipsuga algavaid klassi funktsioone __nimetatakse erifunktsioonideks, kuna neil on eriline tähendus.

Erilist huvi pakub __init__()funktsioon. Seda erifunktsiooni kutsutakse alati, kui selle klassi uus objekt on instantsitud.

Seda tüüpi funktsioone nimetatakse objektioperaadis (OOP) ka konstruktoriteks. Tavaliselt kasutame seda kõigi muutujate lähtestamiseks.

 class ComplexNumber: def __init__(self, r=0, i=0): self.real = r self.imag = i def get_data(self): print(f'(self.real)+(self.imag)j') # Create a new ComplexNumber object num1 = ComplexNumber(2, 3) # Call get_data() method # Output: 2+3j num1.get_data() # Create another ComplexNumber object # and create a new attribute 'attr' num2 = ComplexNumber(5) num2.attr = 10 # Output: (5, 0, 10) print((num2.real, num2.imag, num2.attr)) # but c1 object doesn't have attribute 'attr' # AttributeError: 'ComplexNumber' object has no attribute 'attr' print(num1.attr)

Väljund

 2 + 3j (5, 0, 10) Traceback (viimane kõne viimati): fail "", rida 27, trükis (num1.attr) AttributeError: Objektil 'ComplexNumber' pole atribuuti 'attr'

Ülalolevas näites määratlesime uue klassi kompleksarvude tähistamiseks. Sellel on kaks funktsiooni: __init__()muutujate lähtestamine (vaikimisi null) ja get_data()numbri õige kuvamine.

Huvitav on ülaltoodud etapis märkida, et objekti atribuute saab luua käigu pealt. Lõime objektile num2 uue atribuudi attr ja lugesime ka selle läbi. Kuid see ei loo seda atribuuti objektile num1.

Atribuutide ja objektide kustutamine

Objekti mis tahes atribuudi saab delavalduse abil igal ajal kustutada . Väljundi nägemiseks proovige Pythoni kestal järgmist.

 >>> num1 = ComplexNumber(2,3) >>> del num1.imag >>> num1.get_data() Traceback (most recent call last):… AttributeError: 'ComplexNumber' object has no attribute 'imag' >>> del ComplexNumber.get_data >>> num1.get_data() Traceback (most recent call last):… AttributeError: 'ComplexNumber' object has no attribute 'get_data'

Võime isegi objekti ise kustutada, kasutades del-lauset.

 >>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last):… NameError: name 'c1' is not defined

Tegelikult on see keerulisem kui see. Kui seda teeme c1 = ComplexNumber(1,3), luuakse mällu uus esemeobjekt ja nimi c1 seob end sellega.

Käsul del c1eemaldatakse see sidumine ja nimi c1 kustutatakse vastavast nimeruumist. Objekt eksisteerib siiski mälus ja kui sellega pole seotud ühtegi teist nime, hävitatakse see hiljem automaatselt.

Seda viitamata objektide automaatset hävitamist Pythonis nimetatakse ka prügiveoks.

Objektide kustutamine Pythonis eemaldab nime sidumise

Huvitavad Artiklid...