Cara Mendefinisikan Metode NonPublic Di Class Python
Cara idiomatik untuk menggunakan Python sebagai OOP
Python adalah bahasa pemrograman berorientasi objek (OOP) intinya, yang membangun fungsionalitas di sekitar objek. String adalah objek, instance kelas kustom adalah objek, dan begitu juga kelas, modul, dan bahkan paket. Salah satu prinsip jangka panjang pengkodean OOP adalah enkapsulasi. Ini adalah pola desain yang memperlihatkan fungsionalitas yang dibutuhkan Users sambil menyembunyikan detail implementasi dan fitur yang tidak perlu diakses Users.
Setiap proyek mendefinisikan satu set kelas khusus sebagai dasar untuk memodelkan berbagai jenis data. Oleh karena itu, proyek yang baik berarti mendefinisikan kelas kustom yang terstruktur dengan baik. Teknik enkapsulasi harus diterapkan saat menggunakan kelas-kelas ini. Saya tidak berpikir enkapsulasi harus diperlakukan sebagai dogma, tetapi untuk meningkatkan pemeliharaan proyek Anda, Anda dapat mempertimbangkan dua fitur enkapsulasi khusus: metode protected dan metode private yang dimaksudkan untuk Usersan internal. Artikel ini menjelaskan cara melakukannya.
Kata pengantar
Seperti yang mungkin Anda ketahui, beberapa bahasa OOP menyimpan kata kunci enkapsulasi seperti protected, private, dan public yang menentukan cara mengakses atribut (atau metode) di luar kelas. Namun, Python tidak memiliki kata kunci ini. Sebenarnya, semua yang didefinisikan dalam kelas Python bersifat publik. Artinya, Anda dapat mengakses semua yang ada di kelas jika Anda mau.
Meskipun demikian, Python memiliki beberapa aturan tentang enkapsulasi. Kami menggunakan terminologi dunia OOP umum untuk kemudahan diskusi. Dalam hal mengontrol tingkat akses, tidak ada perbedaan antara atribut dan metode. Oleh karena itu, kami akan menggunakan metode untuk menunjukkan teknik yang relevan.
Tentukan metode protected
Anda dapat menentukan atribut protected Python. Konvensinya adalah menggunakan garis bawah sebelum nama metode. Perhatikan contoh berikut:
class User:
def __init__(self,username) -> None:
self.username = username def login(self):
print(f"{self.username} just logged in.") def signup(self):
self._check_account_existence()
print(f"{self.username} just signed up an account.") def _check_account_existence(self):
print(f"Checking if {self.username} has signed up already.")
Di kelas Users ini, metode pendaftaran bersifat publik, tetapi metode _check_account_existence itu adalah protected. Metode ini tidak diekspos dan tidak disertakan dalam tip pelengkapan otomatis saat bekerja dengan instance kelas Users.
Petunjuk Pelengkapan Otomatis Jangan Sertakan Metode protected
Seperti yang Anda lihat, daftar hanya berisi pendaftaran, bukan metode _check_account_existence. Secara khusus, bahkan saat memanggil metode protected ini, Anda dapat:
>>> user = User("cowboy")
>>> user._check_account_existence()
Checking if cowboy has signed up already.
Alasannya adalah, seperti yang disebutkan sebelumnya, Python tidak memiliki kontrol akses yang ketat ke metode kelas dan memberi awalan nama metode untuk menunjukkan (jangan memaksakan) bahwa itu adalah metode protected.
Tentukan metode private
Teknik enkapsulasi lain melibatkan mendefinisikan metode private. Alih-alih menggunakan satu garis bawah, Anda dapat menggunakan dua garis bawah sebagai awalan untuk nama metode untuk menunjukkan bahwa itu adalah metode private. Lihat contoh di bawah ini.
class User:
def __init__(self,username) -> None:
self.username = username
def signup(self):
self._check_account_existence()
print(f"{self.username} just signed up an account.")
def _check_account_existence(self):
print(f"Checking if {self.username} has signed up already.")
def login(self):
print(f"{self.username} just logged in.")
self.__pull_data_after_login()
def __pull_data_after_login(self):
print(f"Pull additional data for the user: {self.username}")
Di kelas User, __pull_data_after_login adalah metode private. Demikian pula, metode private ini tidak masuk ke daftar petunjuk pelengkapan otomatis.
Petunjuk Pelengkapan Otomatis Jangan Sertakan Metode PrivateSaya sebutkan sebelumnya bahwa saya dapat mengakses metode private di luar kelas jika saya mau, tetapi saya telah menemukan bahwa saya dapat menggunakan metode protected. Apakah itu juga berlaku untuk metode private?
>>> user = User("cowboy")
>>> user.__pull_data_after_login()
# AttributeError: 'User' object has no attribute '__pull_data_after_login'
Apakah kesalahan berarti saya tidak dapat mengakses metode private di luar kelas? tidak terlalu. Untuk mengakses metode privat di luar kelas, Anda perlu mengetahui konsep name mangling. Name mangling memungkinkan nama-nama metode private untuk dirusak ketika diakses secara eksternal. Secara khusus, ada aturan berikut:__private_method-> _ClassName__private_method. Oleh karena itu, Anda dapat mengakses __pull_data_after_login sebagai berikut:
>>> user = User("cowboy")
>>> user._User__pull_data_after_login()
Pull additional data for the user: cowboy
Manfaat menggunakan metode private
Dari tangkapan layar ini, Anda dapat melihat bahwa menyembunyikan metode private (protected dan private) membantu Users dapat meningkatkan efisiensi pengkodean mereka. Anda tidak perlu khawatir memilih metode private. saya seharusnya menggunakannya.
Secara khusus, metode ini masih dapat digunakan di dalam kelas. Gambar berikut menunjukkan bahwa tip pelengkapan otomatis memahami aksesibilitas metode private ini.
Akses Internal ke Metode Nonpublik
Enkapsulasi hanya berlaku untuk kode di luar kelas. Seperti yang ditunjukkan pada gambar di atas, Anda masih dapat memilih metode private dari daftar petunjuk pelengkapan otomatis, bahkan saat bekerja di dalam kelas.
Perbedaan antara menambahkan metode protected dan private
Ketika kami memperkenalkan metode terproteksi dan privat di setiap bagian, kami secara implisit menunjukkan perbedaan antara metode terproteksi dan privat.
Metode protected menggunakan satu garis bawah sebagai awalan, dan metode private menggunakan dua garis bawah sebagai awalan. Anda dapat menggunakan nama metode untuk secara langsung memanggil metode protected di luar kelas. Namun, Anda memerlukan mangling nama untuk memanggil metode private.
Selain dua perbedaan yang jelas antara metode protected dan metode private, perbedaan utama antara kedua metode ini terkait dengan aksesibilitas dalam subkelas. Artinya, metode protected dapat diakses dalam subkelas, tetapi metode private tidak dapat diakses dalam subkelas (karena nama mangling). Perhatikan contoh berikut.
class Administrator(User):
def admin_signup(self):
super()._check_account_existence()
def admin_login(self):
super().__pull_data_after_login()
>>> admin = Administrator("rodeo")>>> admin.admin_signup()
Checking if rodeo has signed up already.>>> admin.admin_login()
# AttributeError: 'super' object has no attribute '_Administrator__pull_data_after_login'
Seperti yang ditunjukkan di atas, kelas Administrator menggunakan metode private protected superclass saat mendefinisikan admin_signup dan admin_login. Dengan dua metode ini, hanya admin_signup yang berfungsi, admin_login tidak. Alasannya adalah bahwa metode private secara otomatis memicu mangling nama menggunakan nama kelas saat ini. Tujuan kami adalah menggunakan metode private superclass, tetapi mereka tidak tersedia di dalam subclass.
Oleh karena itu, jika Anda mendefinisikan metode private yang ingin Anda buat tidak dapat diakses di dalam subkelas Anda, Anda harus menggunakan metode private. Jika tidak, Anda perlu menggunakan metode protected agar dapat diakses di dalam subkelas Anda.
Kesimpulan
Dalam artikel ini, kita telah melihat teknik untuk mendefinisikan metode terproteksi dan privat di kelas Python. Teknik-teknik ini berhubungan dengan enkapsulasi, sebuah konsep OOP yang penting. Python tidak menggunakan protected atau private sebagai kata kunci, tetapi Anda harus menghormati aturan Usersan garis bawah sebagai awalan untuk metode private ini.
Sekian artikel yang dapat saya sampaikan, semoga bermanfaat Happy Coding :)