Articles

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.

Esempio: Attributi pubblici

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.

Esempio: Access Public Members

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.

Esempio: Attributi protetti

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:

Esempio: l’Accesso ai Membri Protetti

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.

Esempio: Attributi protetti

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.

Esempio: l’Accesso ai Membri Protetti

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.

PUBBLICITÀ

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:

Esempio: Attributi Privati

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

Esempio:

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.

Esempio:

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