Laboratorul 3
(Deadline: 04.05.2024 23:59:59)
Daca nu sunteti logati exercitiile nu se mai afiseaza.
Module
Crearea modulelor proprii
Orice program este de fapt un modul.
Un modul poate fi importat in alt program cu instructiunea
import nume_modul
Din acest moment putem folosi clasele si functiile definite in modul.
Putem importa si un singur element din modul:
from nume_modul import element
In momentul importarii unui modul, acesta se si executa. Putem verifica daca se executa codul in cadrul modulului (si nu printr-un import) testand:
if __name__ = "__main__":
Clase
Pentru a crea clase folosim cuvantul cheie class.
class Dreptunghi:
Constructorul este metoda __init__(). Ca si alte functii ce tin de instanta, va primi ca parametru chiar obiectul curent. Rolul constructorului e sa initializeze obiectul.
Pentru a accesa proprietati in interiorul metodelor de instanta (cum e si constructorul) folosim identificatorul self. Atentie, aceasta e doar o conventie, putem sa ii dam orice nume, insa pentru o intelegere mai buna a codului folosim self. Acest lucru se intampla deoarece in metodele de instanta primul parametru este mereu obiectul.
Tot o astfel de conventie avem si pentru metodele de clasa unde folosim prin conventie identificatorul cls pentu parametrul care ar trebui sa primeasca clasa.
Daca dorim sa stergem proprietati ale obiectelor sau chiar obiecte folosim del
.
class Dreptunghi:
"""O clasa care memoreaza un dreptunghi format din caractere"""
#atribute de clasa (statice)
liniiSeparatoare=True;
simbolSeparator="-"
dimLinieSeparatoare=15
def __init__(self, inaltime, latime, simbolContinut, simbolContur=None):
#atribute de instanta
self.inaltime = inaltime
self.latime = latime
self.simbolContinut = simbolContinut
self.simbolContur = "#" if simbolContur is None else simbolContur
def arie(self):
return self.inaltime*self.latime;
@classmethod
def afisSimbolContur(cls):
print('Simbol separator: '+ cls.simbolSeparator)
@classmethod
def afisNumeClasa(cls):
print('Nume clasa:\n'+ cls.__name__)
@classmethod
def afisDoc(cls):
print('Informatii clasa:\n'+ cls.__doc__)
@staticmethod
def afisLinie(n,simbol):
print(n*simbol)
#operatori
def __eq__(self, dr):
return (self.inaltime==dr.inaltime and self.latime==dr.latime)
#observati ca nu trebuie sa ne raportam la aceleasi criterii, chiar daca in general nu este indicat
def __lt__(self, dr):
return self.arie()<dr.arie()
def __lte__(self, dr):
return self.arie()<=dr.arie()
def __gt__(self, dr):
return self.arie()>dr.arie()
#definesc ce va returna repr(obiect)
def __repr__(self):
sir="Prop clasa:\n"
for (k,v) in self.__class__.__dict__.items() :
sir+="{} = {}\n".format(k,v)
sir="Prop instanta:\n"
for (k,v) in self.__dict__.items() :
sir+="{} = {}\n".format(k,v)
return(sir)
#definesc ce va returna str(obiect)
def __str__(self):
sir=self.simbolContur*self.latime+"\n";
for i in range(self.inaltime-2):
sir+=self.simbolContur+self.simbolContinut*(self.latime-2)+self.simbolContur+"\n"
sir+=self.simbolContur*self.latime+"\n"
return(sir)
def afis(self):
if (self.liniiSeparatoare):
self.afisLinie(self.dimLinieSeparatoare,self.simbolSeparator)
print(d)
if (self.liniiSeparatoare):
self.afisLinie(self.dimLinieSeparatoare,self.simbolSeparator)
class Secventa:
secventa=0
def __init__(self):
self.secventa+=1
class HartaJoc(Dreptunghi,Secventa):
simbolObstacol="@"
__matrice__=[]
def __init__(self,nume,inaltime, latime, simbolContinut, simbolContur=None):
Dreptunghi.__init__(self,inaltime, latime, simbolContinut, simbolContur)
Secventa.__init__(self)
sirDr=str(self)
__matrice__=[[] for i in range(inaltime)]
self.nume=nume
def afis(self):
if (self.liniiSeparatoare):
self.afisLinie(self.dimLinieSeparatoare,self.simbolSeparator)
for linie in __matrice__ :
print(linie.join())
if (self.liniiSeparatoare):
self.afisLinie(self.dimLinieSeparatoare,self.simbolSeparator)
if __name__=="__main__":
d1=Dreptunghi(5,10,'.')
print("Am creat dreptunghiul d1=Dreptunghi(5,10,'.')")
##########################################
print("Ce afiseaza print(d1)")
print(d1)
##########################################
print("Ce afiseaza print(str(d1))")
print(str(d1))
##########################################
print("Ce afiseaza print(repr(d1))")
print(repr(d1))
##########################################
d2=Dreptunghi(4,4,'.')
##########################################
Dreptunghi.afisSimbolContur()
Dreptunghi.afisNumeClasa()
Dreptunghi.afisDoc()
##########################################
print("Am creat harta h=HartaJoc('campie',5,10,'.')")
h=HartaJoc('campie',5,10,'.')
##########################################
print("Ce afiseaza print(h)")
print(h)
##########################################
print("Ce afiseaza print(repr(h))")
print(h)
Mostenirea claselor se face prin:
class ClasaDerivata(ClasaBaza):
Functia dir()
Functia dir() afiseaza toate proprietatile si metodele unui obiect.
>>> x=range(1,10)>>> x
range(1, 10)
>>> dir(x)
['__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index', 'start', 'step', 'stop']
>>>