Uvod u jezik PYTHON

(priručnik za  predmet "Skript jezici")


© Matematički fakultet

Miljana Mladenović, Duško Vitas

O Python-u
Instalacija
Sintaksa jezika Python
Osnovne osobine
Službene reči
Operatori i njihovi prioriteti
Osnovne algoritamske strukture
Blok naredbi
if struktura
while struktura
Iskazi: break, continue, pass
Tipovi podataka u Python-u
Osnovni i ugradjeni tipovi
Brojevi
Konverzija formata
Neke matematičke funkcije
Neke random funkcije
Niske
Neke funkcije nad niskama
Formatiranje niski
Liste
Torke
Osnovni izrazi sa torkama
Rečnici
Skupovi
Operacije nad skupovima
Datoteke
Funkcije modula os za rad sa datotekama
Funkcije modula os za rad sa folderima
Izuzeci
Funkcije
Moduli
Paketi
Klase
Regularni izrazi
Baze podataka
Primeri u Netbeans-u

Klase :

     

Python je objektno-orijentisani jezik. Ima implementaciju svih OO tehnika: modularnost, kreiranje klasa, definisanje klasnih promenljivih, metoda klase,  promenljivih instanci klase, metoda instanci klase, inicijalizaciju, nasleđivanje, instanciranje, nadjačavanje metoda i preopterećenje operatora, a jedino je enkapsulacija ograničenog dometa.

Klasa se definiše upotrebom ključne reči class . Sintaksa definicije jedne klase je:

     

class ClassName:

   'opcioni  class documentation string '

   #kome se može pristupiti pomoću promenljive ClassName.__doc__

     

   klasna_promenljiva=0

 

   def __init__( *parametri_konstruktora_klase):

      ...telo_konstruktora_klase

  

   def metodKlase(*parametri_metoda_klase):

        promenljiva_metode=0

     ...telo_metoda_klase

Primer definisanja, instanciranja i upotrebe klase u Python-u:

     

class Student:

   'Klasa student, metodi: prikaziRezim, promeniRezim, prikaziVrstu, promeniVrstu'

   naziv_fakulteta="MATF"                    #promenljiva klase

   rezimTabela=['budzet','samofinansiranje']        #promenljiva klase

   vrsta=['osnovne','master','doktorske']           #promenljiva klase

  

   def __init__( self):                      #inicijalizacija klase

      self.imeStudenta=''

      self.prezimeStudenta=''

      self.godinaStudija=''

      self.rezim_studija=''

      self.vrsta_studija=''

     

  def info(self):                           

            #metod koji pristupa promenljivoj klase

       vrsta=''

       for vr in Student.vrsta:

           vrsta+=vr + ', '

       print "%s fakultet akreditovan za %s studije." %( Student.naziv_fakulteta, \

       vrsta[0:len(vrsta) - 2])

     

   def promeniRezim(self, ime, prezime, upisanaGodina, rezim):    

           # metod koji pristupa                                                          #promenljivama instance klase – operator self 

      self.imeStudenta=ime    

      self.prezimeStudenta=prezime

      self.godinaStudija=upisanaGodina

      if rezim == 1:

         self.rezim_studija=self.rezimTabela[0]

      else:

         self.rezim_studija=self.rezimTabela[1]

     

   def prikaziRezim(self):

        print "Student %s %s skolske 2010/2011 upisao je %s godinu studija, rezim \

           studiranja: %s" \  

           % (self.imeStudenta,self.prezimeStudenta,student.godinaStudija, \

             student.rezim_studija)

     

#u glavnom programu

student=Student()                            #instanciranje klase

student.info()                               #poziv metoda klase

student.promeniRezim('Pera','Peric',2,1)            #promenljiva klase sa prosledjivanjem

                                                #parametara

student.prikaziRezim()

     

MATF fakultet akreditovan za osnovne, master, doktorske studije.

Student Pera Peric skolske 2010/2011 upisao je  2. godinu studija, rezim studiranja: budzet

 

 

 

Za pristup promenljivim, osim klasičnog predstavljenog načina, postoji i niz  built-in funkcija:

 

getattr(<objekat>, <promenljiva>[, default])    # pristup promenljivoj instance

hasattr(<objekat>, <promenljiva>)                        # provera postojanja promenljive instance

setattr(<objekat>, <promenljiva>, <vrednost>)                # postavljanje vrednosti promenljive instance

# ako promenljiva ne postoji, kreira se.

delattr(<objekat>, <promenljiva>)                         # brisanje promenljive instance

     

#uvođenje promenljive instance i dodela vrednosti

datum=datetime.datetime.now().strftime("%I:%M%p on %B %d, %Y")

setattr(Student, 'datumPrijave', datum)

print "novodefinisana promenljiva instance student: ", student.datumPrijave

     

novodefinisana promenljiva instance student:  10:10PM on November 24, 2010

     

     

Svaka klasa ima i tzv. built-in promenljivih klase kojima se pristupa pomoću operatora tačka ( . )

<NazivKlase>.__name__            #Naziv klase

<NazivKlase>.__dict__                                #Rečnik klase koji sadrži prostor imena

<NazivKlase>.__doc__                                 #Dokumentaciona niska klase ako je definisan ili None ako nije.

<NazivKlase>.__module__        #Naziv modula u kome je klasa definisana. U interaktivnom #režimu vrednost ove promenljive je  __main__ .

<NazivKlase>.__bases__            #često prazna torkakoja može sadržati bazne klase po redosledu #njihovih pojavljivanja u listi baznih klasa.

     

print "built-in promenljive klase"

print "Student.__name__:", Student.__name__

print "Student.__doc__:", Student.__doc__

print "Student.__module__:", Student.__module__

print "Student.__bases__:", Student.__bases__

print "Student.__dict__:", Student.__dict__

     

built-in promenljive klase

Student.__name__: Student

Student.__doc__: Klasa student, metodi: prikaziRezim, promeniRezim, prikaziVrstu, promeniVrstu

Student.__module__: __main__

Student.__bases__: ()

Student.__dict__: {'info': <function info at 0x00AE61B0>, 'prikaziRezim': <function prikaziRezim at 0x00AE6530>, '__module__': '__main__', 'naziv_fakulteta': 'MATF', 'rezimTabela': ['budzet', 'samofinansiranje'], 'vrsta': ['osnovne', 'master', 'doktorske'], 'promeniRezim': <function promeniRezim at 0x00AE61F0>, 'datumPrijave': '10:53PM on November 24, 2010', '__doc__': 'Klasa student, metodi: prikaziRezim, promeniRezim, prikaziVrstu, promeniVrstu', '__init__': <function __init__ at 0x00AE6230>}

     

Uništavanje objekata (Garbage Collection)  - nekorišćene instance klasa i promenljive ugrađenih tipova Python uklanja poznatim mehanizmom Garbage Collection. U toku izvršenja programa, kada broj referenci na neku instancu ili promenljivu padne na nulu (0), aktivira se proces uklanjanja datog objekta.

Primer povećanja i smanjenja broja referenci na promenljivu. Kada nestanu sve reference, pokreće se proces uništenja objekta i dealokacije memorije.

     

ime = 'Pera'                  # kreiranje objekta

student = ime           # povećanje broja referenci

listaStudenata = [student]   # povećanje broja referenci

     

del ime                # smanjenje broja referenci

student = 'Mika'      # smanjenje broja referenci

listaStudenata = []  # smanjenje broja referenci

     

Pored automatskog sakupljanja otpada, moguće je unutar klase implementirati specijalan metod __del__(), tzv. destruktor, koji se poziva u trenutku kada se želi uništavanje instance date klase. Ovaj se metod može upotrebiti za uklanjanje nememorijskih resursa koje je klasa koristila.

Ako klasu  Student  dopunimo metodom:

     

   def __del__(self):

       class_name = self.__class__.__name__

       print class_name, "instanca ukonjena"

     

u glavnom programu instanca se uklanja:

     

del student

Student instanca ukonjena

     

     

Nasleđivanje klase: Python obezbeđuje višestruko nasleđivanje. Nasleđena klasa sadrži sve promenljive i metode roditeljskih klasa. Nasleđene klase može menjati i onda dolazi do nadjačavanja (override) metoda roditeljske klase.

     

class NazivNasledjeneKlase (RoditeljskaKlasa1[,RoditeljskaKlasa1, ...]):

    'dokumentaciona niska klase'

    telo klase

     

Primer nasleđivanja klase Student  u klasi StudentOsnovnihStudija. U nasleđenoj klasi metod prikaziRezim je nadjačao (overrided) isti metod u roditeljskoj klasi, kako bi implemetirao upotrebu novodefinisane promenljive smer_studija.

     

class StudentOsnovnihStudija(Student):

    'klasa studenata osnovnih studija po smerovima'

    smer=['matematika','informatika','astronomija']

     

    def prijaviSmer(self, smer):

        if smer == 1:

            self.smer_studija='matematika'

        elif smer == 2:

           self.smer_studija='informatika'

        else:

            self.smer_studija='astronomija'

     

    def prikaziRezim(self):

        print "Student %s %s skolske 2010/2011 upisao je  %s. godinu studija,\

          rezim studiranja: %s" \

              % (self.imeStudenta, self.prezimeStudenta, self.godinaStudija, \

              self.rezim_studija)

        print "smer:" , self.smer_studija

 

#u glavnom programu

studentOsnovnih=StudentOsnovnihStudija()

studentOsnovnih.promeniRezim('Mika','Mikic',3,2)

studentOsnovnih.prijaviSmer(2)

studentOsnovnih.prikaziRezim()

     

Student Mika Mikic skolske 2010/2011 upisao je  3. godinu studija, rezim studiranja: samofinansiranje

smer: informatika

     

Enkapsulacija – proces zaštite podataka u Python obezbeđuje da se određeni objekti ne mogu videti izvan klase u kojoj su definisani. U tom slučaju se takvi objekti moraju imenovati tako da ime počinje znakom donje crte (_)

U prethodnom primeru, za novouvedenu promenljivu brojPolozenihIspita može se uvesti zaštita pristupa podatku izvan date klase. U tom slučaju promenljiva bi se zvala _brojPolozenihIspita. Pristup promenljivoj je direktnim navođenjem njenog imena.

     

class StudentOsnovnihStudija(Student):

    'klasa studenata osnovnih studija po smerovima'

    smer=['matematika','informatika','astronomija']

    _brojPolozenihIspita=0   #privatna promenljiva

   

def prijaviSmer(self, smer):

        if smer == 1:

            self.smer_studija='matematika'

        elif smer == 2:

           self.smer_studija='informatika'

        else:

            self.smer_studija='astronomija'

    def prikaziRezim(self):

        print "Student %s %s skolske 2010/2011 upisao je  %s. godinu studija, \

          rezim studiranja: %s" \

          % (self.imeStudenta, self.prezimeStudenta, self.godinaStudija, \

          self.rezim_studija)

        print "smer:" , self.smer_studija

     

    def polozioIspit(self, broj):

        self._brojPolozenihIspita+=broj   #izmena privatne promenljive unutar

                                          # klase

     

# u glavnom programu

studentOsnovnih=StudentOsnovnihStudija()

studentOsnovnih.promeniRezim('Mika','Mikic',3,2)

studentOsnovnih.prijaviSmer(2)

studentOsnovnih.prikaziRezim()

polozio=studentOsnovnih.polozioIspit(4)

print "Broj ispita koje je student %s %s polozio je %i"  \

         %(studentOsnovnih.imeStudenta, studentOsnovnih.prezimeStudenta, \

         studentOsnovnih._brojPolozenihIspita)

#pristup privatnoj promenljivoj izvan klase u kojoj je definisana

     

Student Mika Mikic skolske 2010/2011 upisao je  3. godinu studija, rezim studiranja: samofinansiranje

smer: informatika

Broj ispita koje je student Mika Mikic polozio je 4

     

     

Preopterećenje operatora (overloading) takvo da je moguć postupak redefinisanja jednog metoda unutar iste klase tako da ima različite potpise u  Python-u nije moguće. Jedino je moguće predefinisanim metodama promeniti način funkcionisanja operatora osnovnih računskih operacija.

     

 

Beograd, novembar 2010.