Python klases un objekti (ar piemēriem)

Šajā apmācībā jūs uzzināsit par Python objektu un klašu galveno funkcionalitāti. Jūs uzzināsiet, kas ir klase, kā to izveidot un izmantot savā programmā.

Video: Python klases un objekti

Python objekti un klases

Python ir uz objektu orientēta programmēšanas valoda. Atšķirībā no procedūru orientētās programmēšanas, kur galvenais uzsvars tiek likts uz funkcijām, objektorientētā programmēšana uzsver objektus.

Objekts ir vienkārši datu (mainīgo) un metožu (funkciju) kopums, kas darbojas uz šiem datiem. Līdzīgi klase ir šī objekta projekts.

Mēs varam uzskatīt klasi par mājas skici (prototipu). Tajā ir visa informācija par grīdām, durvīm, logiem utt. Pamatojoties uz šiem aprakstiem, mēs būvējam māju. Māja ir objekts.

Tā kā daudzas mājas var izgatavot no mājas projekta, mēs varam izveidot daudz priekšmetu no klases. Objektu sauc arī par klases instanci, un šī objekta izveides procesu sauc par instantiation .

Klases definēšana Python

Tāpat kā funkciju definīcijas sākas ar def atslēgvārdu Python, klases definīcijas sākas ar klases atslēgvārdu.

Pirmo virkni klases iekšienē sauc par docstring, un tajā ir īss klases apraksts. Lai gan tas nav obligāti, tas ir ļoti ieteicams.

Šeit ir vienkārša klases definīcija.

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

Klase izveido jaunu vietējo nosaukumvietu, kurā ir definēti visi tās atribūti. Atribūti var būt dati vai funkcijas.

Tajā ir arī īpaši atribūti, kas sākas ar dubultu pasvītrojumu __. Piemēram, __doc__dod mums šīs klases dokstringu.

Tiklīdz mēs definējam klasi, tiek izveidots jauns klases objekts ar tādu pašu nosaukumu. Šis klases objekts ļauj mums piekļūt dažādiem atribūtiem, kā arī izcelt jaunus šīs klases objektus.

 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__)

Rezultāts

 10 Šī ir cilvēku klase

Objekta izveide Python

Mēs redzējām, ka klases objektu var izmantot, lai piekļūtu dažādiem atribūtiem.

To var izmantot arī, lai izveidotu jaunus šīs klases objektu gadījumus (instantiation). Objekta izveides procedūra ir līdzīga funkcijas izsaukumam.

 >>> harry = Person()

Tas izveidos jaunu objekta instanci ar nosaukumu Harijs. Mēs varam piekļūt objektu atribūtiem, izmantojot objekta nosaukuma prefiksu.

Atribūti var būt dati vai metode. Objekta metodes ir atbilstošās šīs klases funkcijas.

Tas nozīmē teikt, tā kā Person.greettas ir funkcijas objekts (klases atribūts), Person.greettas būs metodes objekts.

 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() 

Rezultāts

  Sveiki 

Jūs, iespējams, pamanījāt selfparametru funkciju definīcijā klases iekšienē, bet mēs metodi saucām vienkārši kā harry.greet()bez jebkādiem argumentiem. Tas joprojām darbojās.

Tas notiek tāpēc, ka ikreiz, kad objekts izsauc savu metodi, pats objekts tiek nodots kā pirmais arguments. Tātad, harry.greet()tulko Person.greet(harry).

Parasti metodes izsaukšana ar n argumentu sarakstu ir līdzvērtīga attiecīgās funkcijas izsaukšanai ar argumentu sarakstu, kas izveidots, ievietojot metodes objektu pirms pirmā argumenta.

Šo iemeslu dēļ funkcijas pirmajam argumentam klasē jābūt pašam objektam. To parasti sauc par sevi. To var nosaukt citādi, bet mēs ļoti iesakām ievērot konvenciju.

Tagad jums jāpārzina klases objekts, instances objekts, funkcijas objekts, metodes objekts un to atšķirības.

Konstruktori Python

Klases funkcijas, kas sākas ar dubultu pasvītrojumu __, sauc par īpašām funkcijām, jo ​​tām ir īpaša nozīme.

Īpaša interese ir __init__()funkcija. Šī īpašā funkcija tiek izsaukta ikreiz, kad tiek parādīts jauns šīs klases objekts.

Šāda veida funkcijas objektos orientētā programmēšanā (OOP) tiek sauktas arī par konstruktoriem. Mēs to parasti izmantojam, lai inicializētu visus mainīgos.

 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)

Rezultāts

 2 + 3j (5, 0, 10) Traceback (pēdējais zvans pēdējais): fails "", 27. rinda, drukā (num1.attr) AttributeError: objektam "ComplexNumber" nav atribūta "attr"

Iepriekš minētajā piemērā mēs definējām jaunu klasi, kas apzīmē sarežģītus skaitļus. Tam ir divas funkcijas, __init__()lai inicializētu mainīgos (pēc noklusējuma ir nulle) un get_data()pareizi parādītu skaitli.

Interesanta lieta, kas jāatzīmē iepriekš minētajā solī, ir tāda, ka objekta atribūtus var izveidot lidojot. Mēs izveidojām jaunu atribūtu attr objektam num2 un lasījām to arī. Bet tas nerada objekta num1 atribūtu.

Atribūtu un objektu dzēšana

Jebkuru objekta atribūtu var izdzēst jebkurā laikā, izmantojot delpriekšrakstu. Izmēģiniet Python čaulā šādas darbības, lai redzētu izvadi.

 >>> 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'

Mēs pat varam izdzēst pašu objektu, izmantojot del paziņojumu.

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

Patiesībā tas ir sarežģītāk nekā tas. Kad mēs to darām c1 = ComplexNumber(1,3), atmiņā tiek izveidots jauns instances objekts, un nosaukums c1 ar to saistās.

Komandā del c1šī saistīšana tiek noņemta un nosaukums c1 tiek izdzēsts no atbilstošās nosaukumvietas. Objekts tomēr turpina pastāvēt atmiņā, un, ja tam nav saistīts neviens cits nosaukums, tas vēlāk tiek automātiski iznīcināts.

Šo automātisko neatsauces objektu iznīcināšanu Python sauc arī par atkritumu savākšanu.

Objektu dzēšana pakalpojumā Python noņem nosaukuma saistīšanu

Interesanti raksti...