Python ci dà la possibilità di creare metodi di 'privato' e le variabili all'interno di una classe anteponendo doppia sottolineatura per il nome, in questo modo: __myPrivateMethod()
. Come, quindi, si può spiegare questo
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Qual è l'accordo?!
Lo spiegherò un po 'per coloro che non l'hanno capito.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Quello che ho fatto lì è creare una classe con un metodo pubblico e un metodo privato e istanziarlo.
Successivamente, chiamo il suo metodo pubblico.
>>> obj.myPublicMethod()
public method
Successivamente, provo a chiamare il suo metodo privato.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Qui tutto sembra a posto; non siamo in grado di chiamarlo. È, infatti, "privato". Bene, in realtà non lo è. L'esecuzione di dir () sull'oggetto rivela un nuovo metodo magico che Python crea magicamente per tutti i tuoi metodi "privati".
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Il nome di questo nuovo metodo è sempre un carattere di sottolineatura, seguito dal nome della classe, seguito dal nome del metodo.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Tanto per l'incapsulamento, eh?
In ogni caso, ho sempre sentito che Python non supporta l'incapsulamento, quindi perché provarci? Cosa dà?