Sebuah kunci bagian dari OOP adalah enkapsulasi, dimana melibatkan kemasan yang berhubungan dengan variabel dan fungsi-fungsi ke dalam sebuah objek tunggal yang mudah digunakan.
Sebuah konsep yang berhubungan adalah penyembunyian data, dimana kondisi detail dari implementasi sebuah class harus disembunyikan, dan sebuah interface standar yang bersih dapat dipresentasikan untuk yang ingin menggunakan class tersebut.
Pada bahasa pemrograman lain, ini biasanya dilakukan dengan menggunakan method dan atribut private, dimana memblok akses eksternal ke method dan atribut tertentu di dalam sebuah class.
Filosofi python sedikit berbeda. Seringkali disebut dengan “we are all consenting adults here” atau “kami setuju bahwa orang dewasa berada disini”, yg berarti bahwa kita tidak harus meletakkan batasan-batasan yang berubah-ubah dalam mengakses bagian dari sebuah class. Oleh karena itu tidak ada cara untuk memaksa sebuah method atau atribut menjadi sangat private.
Bagaimanapun juga, ada cara untuk menghalangi orang untuk mengakses bagian-bagian pada sebuah class, seperti dengan memperlihatkan bahwa itu adalah sebuah detail implementasi dan bisa digunakan sesuai dengan resiko yang ada.
Method dan atribut private yang lemah memiliki sebuah underscore tunggal di awal. Ini menandakan bahwa sebuah method atau atribut adalah bersifat private dan tidak boleh digunakan oleh kode eksternal.
Bagaimanapun juga itu hanyalah sebuah kebiasaaan dan tidak menghentikan kode eksternal untuk mengakses method atau atribut tersebut. Hal tersebut juga hanya sebuah efek dari form modul import * untuk tidak meng-import variabel yang dimulai dengan sebuah underscore tunggal.
class Queue:
def __init__(self, contents):
self._hiddenlist = list(contents)
def push(self, value):
self._hiddenlist.insert(0, value)
def pop(self):
return self._hiddenlist.pop(-1)
def __repr__(self):
return "Queue({})".format(self._hiddenlist)
queue = Queue([1, 2, 3])
print(queue)
queue.push(0)
print(queue)
queue.pop()
print(queue)
print(queue._hiddenlist)
=====>
Queue([1, 2, 3])
Queue([0, 1, 2, 3])
Queue([0, 1, 2])
[0, 1, 2]
=====>
Pada code di atas, atribut _hiddenlist ditandai sebagai private, tetapi masih dapat diakses dari kode luar. Method magic __repr__ digunakan untuk merepresentasikan string pada instance.
Method dan atribut private yang kuat memiliki double underscrore di awal nama. Hal ini yang menyebabkan nama nya menjadi rusak, sehingga tidak dapat diakses dari luar class. Tujuannya bukan untuk memastikan kode-kode tersebut bersifat private, tetapi untuk mencegah bug jika terdapat subclass yang memiliki method dan atribut dengan nama yang sama.
Method-method ini masih dapat diakses dari luar, tetapi dengan menggunakan sebuah nama yang berbeda. method __privatemethod pada class Spam dapat diakses secara eksternal menggunakan _Spam__privatemethod.
class Spam:
__egg = 7
def print_egg(self):
print(self.__egg)
s = Spam()
s.print_egg()
print(s._Spam__egg)
print(s.__egg)
=====>
7
7
Traceback (most recent call last):
File "b.py", line 10, in <module>
print(s.__egg)
AttributeError: 'Spam' object has no attribute '__egg'
=====>
LANJUTKAN BACA MATERI LENGKAP