Lewati ke konten utama

Penjelasan Metode Privat di Python

Pelajari tentang metode privat di Python, sintaksnya, cara dan kapan menggunakannya dalam proyek Anda dengan contoh, serta praktik terbaik.
· 9 mnt Baca

Jelajahi bersama AI

Dalam Pemrograman Berorientasi Objek (OOP), sebuah pendekatan desain perangkat lunak, kita menggunakan “objek” untuk memodelkan entitas dunia nyata. Objek adalah struktur data dengan atribut (data) dan metode (fungsi) yang beroperasi pada data tersebut. Sistem yang kompleks bisa lebih mudah dirancang dengan objek.

Pelajari lebih lanjut dasar-dasar dan konsep rekayasa perangkat lunak di balik OOP dengan memulai kursus object-oriented programming dengan Python kami.

Enkapsulasi adalah konsep fundamental dalam OOP. Ini berarti mengelompokkan data dan metode dari sebuah objek serta menyembunyikan detailnya dari dunia luar. Bayangkan enkapsulasi sebagai proses yang menciptakan sebuah “kapsul” (objek) dengan data dan cara memanipulasinya sendiri.

Tujuan utama enkapsulasi adalah untuk:

  • Mencegah akses langsung ke data (integritas data).
  • Menyederhanakan sistem dengan hanya menampilkan yang diperlukan (abstraksi).

Metode privat adalah kunci untuk mencapai enkapsulasi ini dengan menyembunyikan detail implementasi internal dari suatu kelas.

Dengan menjadikan suatu metode privat, Anda memberi tahu programmer lain bahwa metode ini tidak dimaksudkan untuk diakses secara langsung. Ini dapat mencegah bug dan kesalahan dengan memastikan bahwa keadaan internal sebuah objek hanya dapat diubah dengan cara yang terkontrol.

Di sini, kami akan memperkenalkan metode privat, sintaks untuk mendefinisikannya, mengimplementasikan metode privat dalam contoh dunia nyata, dan praktik terbaik untuk menggunakannya.

Apa Itu Metode Privat?

Metode privat dalam pemrograman berorientasi objek (OOP) adalah fungsi di dalam sebuah kelas yang dirancang hanya untuk penggunaan internal. Metode ini mengenkapsulasi fungsionalitas kelas, memastikan cara kerjanya tetap tersembunyi dari interaksi eksternal.

Enkapsulasi ini memberikan lapisan abstraksi, memungkinkan kelas mempertahankan kontrol atas keadaan dan perilaku internalnya serta mengubah implementasinya tanpa memengaruhi kode eksternal yang bergantung padanya.

Di Python, konvensi untuk menandai metode privat adalah dengan menambahkan awalan satu garis bawah (_) atau dua garis bawah (__) pada nama metode. Ini berfungsi sebagai petunjuk bagi pengembang tentang cakupan yang dimaksud untuk metode tersebut dan sifatnya hanya konvensi.

Meskipun konvensi ini tidak menerapkan privasi secara ketat seperti di beberapa bahasa lain, praktik ini sangat dihormati dalam komunitas Python untuk memberi isyarat tentang penggunaan metode yang dimaksudkan. Nanti, kita akan membahas aspek-aspek ini lebih mendalam.

Sintaks Metode Privat

Ada dua cara berbeda untuk mendefinisikan metode privat, yang akan kita lihat melalui contoh.

Kita dapat mendefinisikan metode privat menggunakan satu garis bawah sebelum nama fungsi:

class MyClass:
   def _private_method(self):
       print("This is a private method")

Definisi ini hanyalah konvensi bagi para programmer karena fungsi tersebut masih dapat diakses dari luar kelas, meskipun tidak direkomendasikan.

Jika ini pertama kalinya Anda mendengar tentang kelas di Python, kami menyarankan untuk melihat terlebih dahulu tutorial ramah pemula tentang Classes kami.

Mari kita buat sebuah objek dan coba akses metode privat yang dibuat:

# Creating an object
obj = MyClass()

# Accessing from outside
obj._private_method()  # Not recommended to call directly, but possible

Ada sintaks lain untuk mendefinisikan metode privat di Python menggunakan dua garis bawah. Bentuknya seperti ini:

class MyClass:
   def __private_method(self):
       print("This is a private method")

obj = MyClass()
# obj.__private_method()  # This will raise an AttributeError

Saat kita mencoba mengakses metode privat dari luar kelas, akan muncul AttributeError, menandakan bahwa metode tersebut tidak dapat diakses langsung menggunakan nama fungsinya.

Ringkasnya, sintaks metode privat di Python:

  • Satu garis bawah: hanya konvensi bagi programmer, dapat diakses dari luar fungsi.
  • Dua garis bawah: tidak dapat diakses dari luar fungsi hanya dengan nama fungsinya. Metode ini masih dapat diakses melalui “Name Mangling” yang akan kita lihat nanti dalam tutorial ini.

Mengimplementasikan Metode Privat di Python

Sebagai contoh dunia nyata, pertimbangkan sebuah kelas BankAccount yang aman dan ramah pengguna untuk mengelola transaksi keuangan bagi seorang pengguna. Persyaratan rekening bank adalah:

  • Kelas harus mengen kapsul saldo pemilik rekening, memungkinkan setoran dan penarikan sambil memastikan bahwa saldo tidak dapat dimanipulasi langsung dari luar kelas.
  • Kelas harus memfasilitasi transfer yang aman antar rekening, memperbarui saldo rekening penerima tanpa mengekspos mekanisme internal untuk modifikasi saldo.
  • Solusi harus mematuhi prinsip-prinsip pemrograman berorientasi objek, khususnya enkapsulasi dan abstraksi, untuk menjaga integritas data rekening dan menyediakan antarmuka yang jelas dan sederhana untuk berinteraksi dengan rekening.

Tentu saja, rekening bank memerlukan lebih banyak fungsionalitas seperti pemeriksaan saldo, konversi mata uang, dan penanganan bunga — tetapi untuk menjaga tetap sederhana, kita akan mengabaikannya dalam implementasi ini.

Mari kita implementasikan solusi ini dan pahami kodenya.

class BankAccount:
   def __init__(self, account_holder, initial_balance=0):
       self.account_holder = account_holder
       self.__balance = initial_balance  # Private attribute

   def deposit(self, amount):
       if amount > 0:
           self.__balance += amount
           print(f"Deposited ${amount}. New balance: ${self.__balance}")
       else:
           print("Deposit amount must be positive.")

   def withdraw(self, amount):
       if 0 < amount <= self.__balance:
           self.__balance -= amount
           print(f"Withdrew ${amount}. New balance: ${self.__balance}")
       else:
           print("Insufficient funds or invalid amount.")

   def __update_balance(self, amount):  # Private method
       self.__balance += amount

   def transfer(self, amount, other_account):
       if 0 < amount <= self.__balance:
           self.withdraw(amount)
           other_account.__update_balance(amount)
           print(f"Transferred ${amount} to {other_account.account_holder}.")
       else:
           print("Insufficient funds or invalid amount.")

Pertama kita membuat BankAccountclass, yang membungkus semua perilaku dan fungsionalitas yang diperlukan oleh objek BankAccount.

Kelas BankAccount memiliki atribut privat __balance dan metode privat __update_balance:

  • Variabel privat (__balance): Ini adalah atribut dari kelas BankAccount yang menyimpan saldo rekening saat ini. Ditandai sebagai privat dengan menambahkan awalan dua garis bawah (__) pada namanya. Ini berarti atribut tersebut dimaksudkan hanya untuk diakses di dalam kelas itu sendiri. Misalnya, atribut ini diubah oleh metode deposit, withdraw, dan __update_balance. Akses eksternal ke atribut ini tidak direkomendasikan.
  • Metode privat (__update_balance): Tujuan metode ini adalah memperbarui saldo rekening. Metode ini dipanggil oleh metode transfer untuk memperbarui saldo rekening penerima selama operasi transfer. Menggunakan metode privat di sini membantu mengenkapsulasi logika untuk memperbarui saldo, memastikan hal itu hanya dapat dilakukan dengan cara yang terkontrol yang ditentukan oleh kelas.

Silakan buat file Python baru, salin dan tempelkan kode di atas dan di bawah, lalu jalankan untuk melihatnya sendiri.

# Using the Bank Account Solution
account1 = BankAccount("John Doe", 1000)
account2 = BankAccount("Jane Doe", 500)

account1.deposit(200)
account1.withdraw(100)
account1.transfer(300, account2)

Anda akan melihat keluaran berikut:

Deposited $200. New balance: $1200
Withdrew $100. New balance: $1100
Withdrew $300. New balance: $800
Transferred $300 to Jane Doe.

Selamat! Anda telah membuat solusi BankAccount menggunakan metode privat!

Berdasarkan keluaran, kita melihat bahwa saat melakukan operasi perbankan biasa seperti menyetor, menarik, dan mentransfer dana, perilaku logis yang biasa dari sebuah rekening bank diikuti.

Metode __init__: apakah ini metode privat?

Anda mungkin memperhatikan metode __init__ yang digunakan dalam contoh Rekening Bank. Karena juga menggunakan sintaks dua garis bawah, Anda mungkin bertanya-tanya apakah ini juga metode privat.

Metode __init__ tidak dianggap sebagai metode privat seperti halnya metode yang diawali dengan dua garis bawah untuk privasi.

Sebaliknya, ini adalah bagian dari metode khusus di Python, sering disebut sebagai metode "dunder" (singkatan dari "double underscore"), yang memiliki tujuan spesifik dalam bahasa tersebut. Contoh lain dari metode khusus semacam itu termasuk __str__, __repr__, dan __del__.

Mari pahami bagaimana metode khusus ini digunakan dalam contoh kita:

class BankAccount:
   def __init__(self, account_holder, initial_balance=0):
       self.account_holder = account_holder
       self.__balance = initial_balance

Seperti yang kita lihat, metode __init__ adalah konstruktor untuk sebuah kelas. Metode ini dipanggil secara otomatis saat instance baru dari kelas dibuat, dan digunakan untuk menginisialisasi atribut objek. Untuk kelas BankAccount, metode __init__ digunakan untuk menetapkan nilai awal bagi atribut account_holder dan __balance.

Konsep Lanjutan: Name Mangling di Python

Sebelumnya dalam definisi kita, kami menyebutkan bahwa metode privat di Python hanyalah konvensi, dan bahasa Python tidak secara ketat menerapkan privasi, tidak seperti bahasa pemrograman lain.

Benar demikian, kita melihat bahwa metode privat dapat diakses langsung saat menggunakan satu garis bawah, tetapi akses dibatasi saat menggunakan dua garis bawah.

Mengapa demikian? Karena adanya konsep yang disebut “name mangling” di Python.

Ketika Anda menambahkan awalan dua garis bawah pada nama atribut, Python secara otomatis memodifikasi nama tersebut dengan menambahkan satu garis bawah dan nama kelas sebelum nama atribut aslinya.

Nama yang telah dimodifikasi inilah yang digunakan untuk menyimpan atribut tersebut secara internal di dalam kelas. Proses memodifikasi nama dengan cara ini dikenal sebagai name mangling.

Name mangling berguna karena dua alasan:

  • Mencegah konflik nama: Dalam pewarisan, jika sebuah subclass mendefinisikan atribut dengan nama yang sama seperti atribut di superclass-nya, keduanya akan bertentangan. Name mangling membantu menghindari masalah ini dengan memastikan bahwa nama-nama tersebut unik untuk setiap kelas.
  • Tingkat privasi tertentu: Meskipun Python tidak memiliki atribut privat sejati, name mangling menyediakan cara untuk membuat atribut kurang dapat diakses dari luar kelas, sehingga menawarkan tingkat privasi tertentu.

Mari lihat contoh untuk memahami lebih baik.

class MyClass:
   def __init__(self):
       self.__private_attribute = "I am private"

   def __private_method(self):
       print("This is a private method")

obj = MyClass()
print(obj.__private_attribute)  # This will raise an AttributeError

Dalam contoh ini, __private_attribute dan __private_method mengalami name mangling. Secara internal, keduanya disimpan sebagai _MyClass__private_attribute dan _MyClass__private_method. Mencoba mengaksesnya menggunakan nama aslinya dari luar kelas akan menghasilkan AttributeError.

Namun, Anda tetap dapat mengaksesnya menggunakan nama yang telah dimangling:

print(obj._MyClass__private_attribute)  # This will print "I am private"
obj._MyClass__private_method()  # This will print "This is a private method"

Meskipun name mangling membuat atribut menjadi kurang dapat diakses, penting untuk dicatat bahwa ini bukan cara yang sepenuhnya aman untuk memastikan privasi di Python. Ini lebih merupakan konvensi untuk menunjukkan bahwa suatu atribut dimaksudkan untuk penggunaan internal dalam kelas.

Praktik Terbaik untuk Menggunakan Metode & Variabel Privat

Memanfaatkan metode dan variabel privat secara efektif memerlukan kepatuhan pada praktik terbaik tertentu. Praktik ini membantu memastikan bahwa kode Anda tidak hanya berfungsi, tetapi juga jelas, mudah dirawat, dan aman.

Berikut beberapa praktik terbaik yang perlu diikuti:

  • Gunakan satu garis bawah untuk atribut “Protected”. Jika Anda ingin menunjukkan bahwa suatu atribut atau metode dimaksudkan untuk digunakan di dalam kelas dan subclass-nya tetapi bukan untuk penggunaan eksternal, tambahkan awalan satu garis bawah (_). Ini adalah konvensi di Python yang memberi isyarat kepada pengembang lain bahwa atribut atau metode tersebut “protected” dan tidak boleh diakses secara langsung.
  • Gunakan dua garis bawah untuk atribut “Private”. Jika Anda ingin membuat atribut atau metode menjadi kurang dapat diakses dari luar kelas untuk menghindari modifikasi atau penggunaan yang tidak disengaja, tambahkan awalan dua garis bawah (__). Ini memicu name mangling dan membuatnya lebih sulit (namun bukan tidak mungkin) untuk mengakses atribut atau metode tersebut dari luar kelas.
  • Gunakan metode privat untuk logika internal. Metode privat (yang diawali satu atau dua garis bawah) adalah cara yang sangat baik untuk mengenkapsulasi logika internal kelas Anda. Gunakan metode ini untuk melakukan tugas-tugas yang spesifik pada implementasi kelas dan tidak boleh diekspos sebagai bagian dari antarmuka publik kelas.

Terakhir, penting untuk konsisten dengan praktik terbaik pengkodean Anda. Patuhi konvensi penamaan dan gunakan secara konsisten di seluruh basis kode Anda. Ini membuat kode Anda lebih mudah dipahami dan dirawat oleh pengembang lain dan diri Anda di masa depan.

Kesimpulan

Tutorial ini memperkenalkan Anda pada konsep di balik metode privat, sintaksnya, dan kapan Anda dapat menggunakannya. Kita juga melihat beberapa contoh yang mengilustrasikan bagaimana Anda dapat menggunakannya dalam proyek pengkodean berikutnya. Terakhir, kita melihat beberapa praktik terbaik yang perlu diingat saat menggunakannya.

Untuk pembelajaran lebih lanjut, Anda dapat melihat Python Programming Skill Track dan kursus Object-oriented Programming in Python.

Arunn Thevapalan

Penulis

Arunn Thevapalan

Sebagai senior data scientist, saya merancang, mengembangkan, dan menerapkan solusi machine learning berskala besar untuk membantu bisnis membuat keputusan yang lebih baik berbasis data. Sebagai penulis di bidang data science, saya berbagi pembelajaran, saran karier, dan tutorial praktis yang mendalam.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai