28.01.2015 Views

Tutorial Python - Starship

Tutorial Python - Starship

Tutorial Python - Starship

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

9.6 Variabile private<br />

Există un suport limitat pentru identificatorii clselor private. Orice identificator de forma __spam (cel puţin<br />

două underscore înainte, cel mult un underscore după) este acum textual înlocuit cu _clasă__spam, unde<br />

clasă este numele curent al clasei cu underscor-urile din faţă suprimate. Mutilarea este realizată fara o analiza<br />

a poziţiei sintactice a identificatorului, aşa încăt putând fi folosită la definirea unei instanţieri a unei clase private<br />

şi a variabilelor şi metodelor clasei ca globale, şi la memorarea instanţierii variabilelor private înaceastă clasă la<br />

instanţierea altei clase. O trunchere a numelui poate apărea când acesta este mai lung de 255 de caractere. În<br />

afara claselor, sau când numele clasei este alcătuit numai din underscor-uri, nu se face eliminarea underscor-urilor.<br />

Acest mecanism pune la dispoziţia programatorului o metodă foarte facilă de a crea atribute private, fără a-şi face<br />

griji că aceste atribute pot provoca conflicte de nume. Toate acestea sunt realizate în <strong>Python</strong> pentru a preveni<br />

eventualele erori, totuşi, este în continuare posibilă modificarea atributelor private, ceea ce se poate dovedi foarte<br />

util în anumite cazuri ca de exemplu la depanare. ( Observatie : o clasă derivată care are acelaşi nume cu clasa de<br />

bază poate folosi variabilele private ale clasei de bază).<br />

Observaţi cum codul ce este trimis instrucţiunilor exec, eval() sau evalfile() nu ia în considerare numele<br />

clasei care realizează invocările, acest efect fiind similar celui realizat prin instrucţiuni global, efect ce<br />

nu poate fi obţinut pentru cod compilat. Aceeaşi restricţie se aplică şi pentru getattr(), setattr() şi<br />

delattr(), de asemenea şi pentru accesarea directă a dicţionarului __dict__.<br />

Iată un exemplu de clase care implementează propriile metode __getattr__() şi __setattr__(), şi<br />

stochează toate datele în variabile private:<br />

class VirtualAttributes:<br />

__vdict = None<br />

__vdict_name = locals().keys()[0]<br />

def __init__(self):<br />

self.__dict__[self.__vdict_name] = {}<br />

def __getattr__(self, name):<br />

return self.__vdict[name]<br />

def __setattr__(self, name, value):<br />

self.__vdict[name] = value<br />

9.7 Altfel de clase<br />

Câteodată, poate fi foarte util să putem crea tipuri de date similare celei record din Pascal, sau struct din C,<br />

tipuri de date care să adune la un loc mai multe date de diferite tipuri. Pentru a realiza acest lucru puteţi folosi<br />

clasele. O definire a unei clase vide se poate face astfel :<br />

class Employee:<br />

pass<br />

john = Employee() # Se creaza o inregistrare vida de tip employee<br />

# Fill the fields of the record<br />

john.name = ’John Doe’<br />

john.dept = ’computer lab’<br />

john.salary = 1000<br />

Să construim un alt scenariu: presupunând că aveţi o funcţie care prelucrează anumite date dintr-un obiect fişier,<br />

puteţi să definiţi o clasă cu metodele read() şi readline() care să citescă informaţii dintr-un şir de caractere<br />

64 Capitolul 9. Clase

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!