Articles

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ă.

exemplu: atribute publice

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 Studentatributele clasei și, de asemenea, modifica valorile lor, așa cum se arată mai jos.

exemplu: Acces Membri publici

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ă.

exemplu: Atribute protejate

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:

exemplu: accesați membrii protejați

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.

exemplu: Atribute protejate

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.setterdecorator la un alt suprasarcini alename() metoda ca metodă setter proprietate. Acum,_name este protejat.

exemplu: acces protejat membrii

copie

>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible

de mai sus, am folosit std.nameproprietate pentru a modifica_nameatribut. 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.

publicitate

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:

exemplu: atribute Private

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

exemplu:

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ă.

exemplu:

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++.