Python memberikan kita kemampuan untuk membuat metode 'pribadi' dan variabel dalam kelas dengan mengawali garis bawah ganda untuk nama, seperti ini: __myPrivateMethod()
. Bagaimana, kemudian, seseorang dapat menjelaskan hal ini
>>> 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!!
Apa masalahnya ?!
Saya akan menjelaskan ini sedikit untuk mereka yang tidak mengerti.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Apa yang saya lakukan di sana adalah membuat kelas dengan metode publik dan metode pribadi dan instantiate.
Selanjutnya, saya sebut metode publiknya.
>>> obj.myPublicMethod()
public method
Selanjutnya, saya mencoba dan memanggil metode privatnya.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Semuanya terlihat bagus di sini; kami tidak dapat menyebutnya. Ini sebenarnya adalah 'pribadi'. Sebenarnya tidak. Menjalankan dir () pada objek tersebut mengungkapkan metode magis baru yang python buat secara ajaib untuk semua metode 'pribadi' Anda.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Nama metode baru ini selalu garis bawah, diikuti oleh nama kelas, diikuti oleh nama metode.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Begitu banyak untuk enkapsulasi, eh?
Bagaimanapun, saya selalu mendengar Python tidak mendukung enkapsulasi, jadi mengapa bahkan mencoba? Apa yang menyebabkannya?