Python – Public, Protected, Private Members
I linguaggi orientati agli oggetti classici, come C++ e Java, controllano l’accesso alle risorse di classe tramite parole chiave pubbliche, private e protette. Ai membri privati della classe viene negato l’accesso dall’ambiente esterno alla classe. Possono essere gestiti solo dall’interno della classe.
I membri pubblici
I membri pubblici (generalmente metodi dichiarati in una classe) sono accessibili dall’esterno della classe. L’oggetto della stessa classe è necessario per invocare un metodo pubblico. Questa disposizione di variabili di istanza private e metodi pubblici garantisce il principio dell’incapsulamento dei dati.
Tutti i membri di una classe Python sono pubblici per impostazione predefinita. È possibile accedere a qualsiasi membro dall’esterno dell’ambiente di classe.
Copia
class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute
È possibile accedere agli attributi della classe Student
e anche modificare i loro valori, come mostrato di seguito.
Copy
>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25
Protected Members
Protected members of a class are accessible from within the class and are also available to its sub-classes. Nessun altro ambiente è consentito l’accesso ad esso. Ciò consente alle risorse specifiche della classe padre di essere ereditate dalla classe figlio.
La convenzione di Python per proteggere una variabile di istanza consiste nell’aggiungere un prefisso _ (single underscore) ad esso. Ciò impedisce efficacemente l’accesso a meno che non provenga da una sottoclasse.
Copia
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
In effetti, ciò non impedisce alle variabili di istanza di accedere o modificare l’istanza. È comunque possibile eseguire le seguenti operazioni:
Copia
>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'
Tuttavia, è possibile definire una proprietà utilizzando la struttura decoratore e renderlo protetto, come mostrato di seguito.
Copia
class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname
Sopra, @proprietà decoratore è usato per fare il name()
metodo di proprietà e @name.setter
decoratore a un altro overload del name()
metodo setter di metodo. Ora, _name
è protetto.
Copia
>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible
in Precedenza, abbiamo usato std.name
proprietà per modificare _name
attributo. Tuttavia, è ancora accessibile in Python. Quindi, il programmatore responsabile si asterrebbe dall’accedere e modificare le variabili di istanza con prefisso _
dall’esterno della sua classe.
Membri privati
Python non ha alcun meccanismo che limita efficacemente l’accesso a qualsiasi variabile o metodo di istanza. Python prescrive una convenzione di prefissare il nome della variabile / metodo con un trattino basso singolo o doppio per emulare il comportamento degli specificatori di accesso protetto e privato.
Il doppio trattino basso__
preceduto da una variabile lo rende privato. Dà un forte suggerimento di non toccarlo dall’esterno della classe. Qualsiasi tentativo di farlo si tradurrà in un AttributeError:
Copia
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.')
Copia
>>> 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 esegue l’alterazione dei nomi di variabili private. Ogni membro con un doppio trattino basso verrà modificato in _object._class__variable
. Quindi, è ancora possibile accedervi dall’esterno della classe, ma la pratica dovrebbe essere astenuta.
Copy
>>> std = Student("Bill", 25)>>> std._Student__name'Bill'>>> std._Student__name = 'Steve'>>> std._Student__name'Steve'>>> std._Student__display()'This is private method.'
Quindi, Python fornisce l’implementazione concettuale di modificatori di accesso pubblico, protetto e privato, ma non come altri linguaggi come C#, Java, C++.
Leave a Reply