Python-membrii publici, protejați, privați
limbaje clasice orientate pe obiecte, cum ar fi C++ și Java, controlează accesul la resursele clasei prin cuvinte cheie publice, private și protejate. Membrilor privați ai clasei li se refuză accesul din mediul din afara clasei. Ele pot fi manipulate numai din cadrul clasei.
membrii publici
membrii publici (în general metodele declarate într-o clasă) sunt accesibile din afara clasei. Obiectul aceleiași clase este obligat să invoce o metodă publică. Acest aranjament de variabile de instanță private și metode Publice asigură principiul încapsulării datelor.
toți membrii dintr-o clasă Python sunt publici în mod implicit. Orice membru poate fi accesat din afara mediului de clasă.
copie
class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute
puteți accesa Student
atributele clasei și, de asemenea, modifica valorile lor, așa cum se arată mai jos.
copie
>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25
membri protejați
membrii protejați ai unei clase sunt accesibili din cadrul clasei și sunt disponibili și subclaselor acesteia. Nici un alt mediu nu este permis accesul la acesta. Acest lucru permite ca resursele specifice ale clasei părinte să fie moștenite de clasa copil.
Convenția Python de a face o variabilă de instanță protejată este de a adăuga un prefix _ (subliniere unică). Acest lucru împiedică în mod eficient accesarea acestuia, cu excepția cazului în care provine dintr-o subclasă.
Copy
class Student: _schoolName = 'XYZ School' # protected class attribute def __init__(self, name, age): self._name=name # protected instance attribute self._age=age # protected instance attribute
de fapt, acest lucru nu împiedică variabilele de instanță să acceseze sau să modifice instanța. Puteți efectua în continuare următoarele operații:
copiați
>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'
cu toate acestea, puteți defini o proprietate folosind decorator de proprietăți și o puteți proteja, așa cum se arată mai jos.
Copy
class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname
de mai sus, @property decorator este folosit pentru a facename()
metoda ca proprietate și@name.setter
decorator la un alt suprasarcini alename()
metoda ca metodă setter proprietate. Acum,_name
este protejat.
copie
>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible
de mai sus, am folosit std.name
proprietate pentru a modifica_name
atribut. Cu toate acestea, este încă accesibil în Python. Prin urmare, programatorul responsabil s-ar abține de la accesarea și modificarea variabilelor de instanță prefixate cu _
din afara clasei sale.
membri privați
Python nu are nici un mecanism care restricționează în mod eficient accesul la orice variabilă instanță sau metodă. Python prescrie o convenție de prefixare a numelui variabilei / metodei cu o subliniere simplă sau dublă pentru a emula comportamentul specificatorilor de acces protejat și privat.
sublinierea dublă__
prefixată la o variabilă o face privată. Oferă o sugestie puternică de a nu-l atinge din afara clasei. Orice încercare de a face acest lucru va avea ca rezultat un AttributeError:
copie
class Student: __schoolName = 'XYZ School' # private class attribute def __init__(self, name, age): self.__name=name # private instance attribute self.__salary=age # private instance attribute def __display(self): # private method print('This is private method.')
copie
>>> std = Student("Bill", 25)>>> std.__schoolNameAttributeError: 'Student' object has no attribute '__schoolName'>>> std.__nameAttributeError: 'Student' object has no attribute '__name'>>> std.__display()AttributeError: 'Student' object has no attribute '__display'
Python efectuează mangling nume de variabile private. Fiecare membru cu o subliniere dublă va fi schimbat în _object._class__variable
. Deci, poate fi accesat în continuare din afara clasei, dar practica ar trebui să fie abținută.
Copy
>>> std = Student("Bill", 25)>>> std._Student__name'Bill'>>> std._Student__name = 'Steve'>>> std._Student__name'Steve'>>> std._Student__display()'This is private method.'
astfel, Python oferă implementarea conceptuală a modificatorilor de acces public, protejat și privat, dar nu ca alte limbi precum C#, Java, C++.
Leave a Reply