Klase i objekti Pythona (s primjerima)

U ovom uputstvu naučit ćete o osnovnoj funkcionalnosti Python objekata i klasa. Naučit ćete što je razred, kako ga stvoriti i koristiti u svom programu.

Video: Klase i objekti Pythona

Python objekti i razredi

Python je objektno orijentirani programski jezik. Za razliku od programiranja usmjerenog na postupak, gdje je glavni naglasak na funkcijama, objektno orijentirano programiranje naglašava objekte.

Objekt je jednostavno zbirka podataka (varijable) i metoda (funkcija) koje djeluju na te podatke. Slično tome, klasa je nacrt za taj objekt.

O klasi možemo razmišljati kao o skici (prototipu) kuće. Sadrži sve detalje o podovima, vratima, prozorima itd. Na temelju ovih opisa gradimo kuću. Kuća je objekt.

Kako se mnoge kuće mogu izraditi iz nacrta kuće, možemo stvoriti mnoge predmete iz klase. Objekt se također naziva instancom klase, a postupak stvaranja ovog objekta naziva se instancijom .

Definiranje klase u Pythonu

Kao što definicije funkcija počinju s ključnom riječi def u Pythonu, tako i definicije klase počinju s ključnom riječi class.

Prvi niz unutar klase naziva se docstring i ima kratki opis klase. Iako nije obavezno, ovo se toplo preporučuje.

Evo jednostavne definicije klase.

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

Klasa stvara novi lokalni prostor imena gdje su definirani svi njezini atributi. Atributi mogu biti podaci ili funkcije.

U njemu postoje i posebni atributi koji započinju dvostrukim podvlakama __. Na primjer, __doc__daje nam docstring te klase.

Čim definiramo klasu, kreira se novi objekt klase s istim imenom. Ovaj objekt klase omogućuje nam pristup različitim atributima, kao i instanciranje novih objekata te klase.

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

Izlaz

 10 Ovo je razred osobe

Stvaranje objekta u Pythonu

Vidjeli smo da se objekt klase može koristiti za pristup različitim atributima.

Također se može koristiti za stvaranje novih instanci objekta (instance) te klase. Postupak za stvaranje objekta sličan je pozivu funkcije.

 >>> harry = Person()

To će stvoriti novu instancu objekta nazvanu Harry. Atributima objekata možemo pristupiti pomoću prefiksa imena objekta.

Atributi mogu biti podaci ili metoda. Metode objekta odgovarajuće su funkcije te klase.

To znači reći, budući da Person.greetje objekt funkcije (atribut klase), Person.greetbit će objekt metode.

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

Izlaz

  zdravo 

Možda ste primijetili selfparametar u definiciji funkcije unutar klase, ali metodu smo pozvali jednostavno kao harry.greet()bez ikakvih argumenata. Ipak je uspjelo.

To je zato što, kad god objekt pozove svoju metodu, sam objekt se predaje kao prvi argument. Dakle, harry.greet()prevodi u Person.greet(harry).

Općenito, pozivanje metode s popisom od n argumenata ekvivalentno je pozivanju odgovarajuće funkcije s popisom argumenata koji se kreira umetanjem objekta metode prije prvog argumenta.

Iz tih razloga prvi argument funkcije u klasi mora biti sam objekt. To se uobičajeno naziva ja. Može se nazvati i drugačije, ali toplo preporučujemo poštivanje konvencije.

Sada morate biti upoznati s objektom klase, objektom instance, objektom funkcije, objektom metode i njihovim razlikama.

Konstruktori u Pythonu

Funkcije klase koje započinju dvostrukim donjim crtama __nazivaju se posebnim funkcijama jer imaju posebno značenje.

Od posebnog interesa je __init__()funkcija. Ova se posebna funkcija poziva kad god se instancira novi objekt te klase.

Ova vrsta funkcije naziva se i konstruktorima u objektno orijentiranom programiranju (OOP). Obično ga koristimo za inicijalizaciju svih varijabli.

 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)

Izlaz

 2 + 3j (5, 0, 10) Traceback (najnoviji zadnji poziv): Datoteka "", redak 27, u ispisu (num1.attr) AttributeError: 'ComplexNumber' objekt nema atribut 'attr'

U gornjem primjeru definirali smo novu klasu koja predstavlja složene brojeve. Ima dvije funkcije, __init__()inicijalizirati varijable (zadane vrijednosti su nule) i get_data()pravilno prikazati broj.

Zanimljiva stvar koju treba primijetiti u gornjem koraku je da se atributi objekta mogu stvoriti u hodu. Stvorili smo novi atribut attr za objekt num2 i također ga pročitali. Ali to ne stvara taj atribut za objekt num1.

Brisanje atributa i objekata

Bilo koji atribut objekta može se izbrisati bilo kada, koristeći delizjavu. Pokušajte sljedeće na Python ljusci da biste vidjeli izlaz.

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

Možemo čak i izbrisati sam objekt pomoću del izjave.

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

Zapravo je složenije od toga. Kada to učinimo c1 = ComplexNumber(1,3), u memoriji se kreira novi objekt instance i uz njega se veže naziv c1.

Na naredbu se del c1ovo vezanje uklanja i ime c1 briše se iz odgovarajućeg prostora imena. Objekt, međutim, nastavlja postojati u memoriji i ako na njega nije vezano nijedno drugo ime, kasnije se automatski uništava.

Ovo automatsko uništavanje nereferenciranih objekata u Pythonu naziva se i sakupljanjem smeća.

Brisanjem objekata u Pythonu uklanja se vezivanje imena

Zanimljivi članci...