Kursus
Pernah bertanya-tanya bagaimana Python membuat kelas kustom Anda bekerja mulus dengan fungsi bawaan? Itu berkat metode "dunder" yang canggih—singkatan dari double underscore methods.
Bayangkan Anda membuat kelas untuk bilangan kompleks dan ingin menggunakan operator + secara natural. Alih-alih menulis kode tambahan untuk menangani penjumlahan, Anda mendefinisikan metode __add__, dan Python mengurus sisanya.
Metode-metode sihir ini, seperti __init__ untuk pembuatan objek dan __str__ untuk representasi string, dipanggil secara otomatis oleh Python, sehingga Anda tidak perlu memanggilnya langsung. Metode ini mencegah konflik penamaan dengan metode biasa dan mendayai fitur seperti operator overloading dan perilaku kustom.
Baik saat membuat instance objek, melakukan operasi aritmetika, atau sekadar mencetak sebuah objek, metode dunder bekerja diam-diam di latar belakang untuk membuat kode Anda lebih elegan dan efisien. Jika Anda baru di Python dan ingin mengejar beberapa konsep utama, ikuti kursus Introduction to Python kami untuk fondasi yang baik.
Apa Itu Metode Dunder di Python?
Seperti yang mulai saya singgung, metode dunder Python adalah metode unik, atau "sihir", yang menjadi tulang punggung model data Python dengan memungkinkan kelas kustom Anda berintegrasi dengan operasi bawaan Python. Operator ini mencakup hal-hal seperti pencetakan, pembandingan, dan melakukan aritmetika.
Saat Anda mendefinisikan metode seperti __init__ untuk inisialisasi objek, __repr__ dan __str__ untuk representasi objek, atau bahkan __del__ untuk pembersihan, pada dasarnya Anda memberi tahu Python cara menangani operasi standar untuk objek Anda. Interpreter secara otomatis memanggil metode ini ketika operasi yang sesuai dilakukan. Otomatisasi bawaan ini menciptakan jembatan antara fitur asli Python dan kelas yang ditentukan pengguna.
Nanti, kita akan melihat contoh kelas yang menggunakan metode ini dan yang tidak, sehingga Anda dapat melihat bagaimana semua ini bekerja.
Kategori Metode Dunder
Mari jelajahi kategori utama metode dunder dan lihat bagaimana metode ini memberdayakan kode Anda.
1. Inisialisasi dan konstruksi
Metode dunder seperti __new__, __init__, dan __del__ mengontrol bagaimana objek dibuat, diinisialisasi, dan akhirnya dihancurkan.
-
__new__vs.__init__:__new__bertanggung jawab membuat instance baru, sedangkan__init__menginisialisasinya. Pemisahan ini penting saat bekerja dengan tipe immutable, di mana Anda mungkin menimpa__new__untuk tujuan tertentu. -
__del__: Metode ini bertindak sebagai destruktor, memungkinkan pembersihan ketika sebuah objek akan dikumpulkan sebagai garbage.
Anda bahkan dapat menyesuaikan __new__ pada kelas immutable untuk menerapkan aturan pembuatan tertentu.
2. Metode numerik dan aritmetika
Metode dunder seperti __add__, __sub__, __mul__, dan varian in-place-nya memungkinkan objek Anda mendukung operasi aritmetika. Ini dikenal sebagai operator overloading. Dengan mendefinisikan metode ini, Anda dapat mengaktifkan perilaku aritmetika yang natural untuk objek kustom Anda.
Sebagai contoh, overload __add__ dalam kelas Vector untuk menjumlahkan elemen yang bersesuaian dari dua vektor. Ini sangat berguna saat merancang kelas yang memodelkan konsep matematika atau instrumen keuangan.
3. Metode perbandingan dan kesetaraan
Metode seperti __eq__, __lt__, dan __gt__ menentukan bagaimana objek dibandingkan. Metode ini memungkinkan Anda mendefinisikan apa artinya dua objek setara atau bagaimana mereka harus diurutkan.
Contoh umum adalah membandingkan luas dua bentuk: Anda dapat menimpa __lt__ untuk mengembalikan true jika luas satu bentuk lebih kecil dari bentuk lainnya. Ini dapat membantu dalam koleksi atau algoritma pengurutan.
4. Metode representasi string
Metode __str__ dan __repr__ mengontrol bagaimana objek Anda ditampilkan sebagai string.
-
__repr__harus memberikan representasi yang ramah pengembang yang dapat digunakan untuk membuat ulang objek. -
__str__berfokus pada tampilan yang ramah pengguna.
5. Metode kontainer dan iterable
Agar objek Anda berperilaku seperti urutan atau kontainer, Anda dapat mengimplementasikan metode seperti __len__, __getitem__, dan __iter__. Ini memungkinkan operasi seperti pengindeksan, iterasi, dan pengujian keanggotaan.
Misalnya, jika Anda merancang stack atau list kustom, mengimplementasikan metode ini memungkinkan Anda menggunakan fungsi bawaan seperti len().
6. Callability dan pemrograman fungsional
Dengan metode __call__, instance kelas Anda dapat dipanggil seperti fungsi. Ini sangat berguna untuk membuat objek fungsi stateful yang dapat melakukan cache hasil atau mempertahankan status internal antar pemanggilan. Anggap saja ini sebagai mengubah objek Anda menjadi mesin komputasi mini yang dapat Anda panggil berulang kali dengan parameter berbeda.
7. Context manager
Mengimplementasikan metode __enter__ dan __exit__ memungkinkan objek Anda digunakan dengan pernyataan with untuk manajemen sumber daya. Ini penting untuk mengelola sumber daya seperti handle berkas atau koneksi jaringan, memastikan semuanya disiapkan dan dibersihkan dengan benar.
Skenario nyata adalah menggunakan context manager kustom untuk membuka dan menutup koneksi database dengan aman.
8. Akses atribut dan deskriptor
Metode seperti __getattr__, __setattr__, dan __delattr__ memungkinkan Anda mengontrol bagaimana atribut diakses dan dimodifikasi. Protokol deskriptor semakin menyempurnakan ini dengan memungkinkan objek mengelola akses atribut secara dinamis.
Sebagai contoh, sebuah deskriptor dapat memvalidasi atau mentransformasi nilai atribut, memastikan nilai tersebut memenuhi kriteria tertentu sebelum disetel.
Metode Dunder Lanjutan dan Lainnya
Walaupun metode dunder inti mencakup sebagian besar kasus penggunaan, Python menyertakan metode lanjutan dan khusus untuk tugas seperti pemrograman asinkron, metaprogramming, dan perilaku spesifik pustaka. Misalnya:
-
Metode asinkron: Metode seperti
__aiter__dan__anext__memungkinkan iterasi asinkron, sementara__await__mendukung objek yang dapat di-await. -
Hook metaprogramming: Metode seperti
__prepare__dan__set_name__memungkinkan pembuatan kelas dinamis dan penamaan atribut. -
Metode khusus pustaka: Pustaka seperti NumPy atau Pandas sering mendefinisikan metode dunder kustom (misalnya,
__array__untuk integrasi NumPy).
Metode lanjutan ini biasanya digunakan untuk tugas khusus sehingga sebagian besar pengembang tidak membutuhkannya setiap hari. Namun, metode ini menunjukkan fleksibilitas dan kedalaman Python. Saya sarankan menjelajahi dokumentasi model data Python resmi untuk daftar lengkapnya. Sumber ini menyediakan detail komprehensif tentang semua metode dunder dan tujuan penggunaannya.
Semua Metode Dunder di Python
Python menyediakan lebih dari 100 metode dunder, masing-masing dirancang untuk mengontrol berbagai aspek perilaku objek. Sementara kita telah mengeksplorasi kategori utama dalam artikel ini, berikut ringkasan tingkat tinggi sebagai referensi cepat:
-
Metode aritmetika: Metode seperti
__add__,__sub__,__mul__, dan__truediv__memungkinkan objek Anda mendukung operator (+,-,*,/). -
Metode perbandingan: Metode seperti
__eq__,__lt__, dan__gt__mendefinisikan bagaimana objek dibandingkan untuk kesetaraan atau urutan. -
Manajemen atribut: Dengan metode seperti
__getattr__,__setattr__, dan__delattr__, Anda dapat mengontrol akses atribut dan mengimplementasikan perilaku dinamis. -
Inisialisasi dan konstruksi:
__new__,__init__, dan__del__masing-masing mengelola pembuatan objek, inisialisasi, dan pembersihan. -
Representasi string: Metode seperti
__str__dan__repr__menentukan bagaimana objek direpresentasikan sebagai string, membantu keluaran yang ramah pengguna. -
Perilaku iterasi dan kontainer: Implementasikan
__iter__dan__next__untuk membuat objek Anda dapat diiterasi serta metode lain untuk mendukung pengindeksan dan pengambilan panjang. -
Callability:
__call__memungkinkan sebuah instance dipanggil seperti fungsi, mendukung gaya pemrograman fungsional dengan perilaku stateful. -
Manajemen konteks: Dengan
__enter__dan__exit__, objek dapat digunakan dengan pernyataan with untuk mengelola sumber daya dengan benar. -
Hook metaprogramming: Metode seperti
__init_subclass__menyediakan cara untuk menyesuaikan pembuatan kelas dan perilaku secara dinamis.
Rujuk dokumentasi Model Data Python resmi untuk daftar lengkap dan detail dari metode dunder ini dan fungsionalitasnya. Sumber komprehensif ini akan membantu Anda membuka sepenuhnya kekuatan model objek Python dan menyusun kode yang lebih elegan dan efisien.
Contoh Dunia Nyata & Use Case
Mari jelajahi bagaimana metode dunder dapat memberdayakan skenario nyata melalui beberapa contoh.
Operator overloading
Bayangkan Anda memiliki kelas numerik atau string kustom. Dengan mengimplementasikan metode dunder seperti __add__ atau __mul__, Anda memungkinkan objek Anda bekerja secara natural dengan operator aritmetika. Anda dapat menjumlah, mengurang, atau mengalikan instance sebagaimana Anda lakukan dengan tipe bawaan, membuat kelas kustom Anda berpadu mulus dengan operasi aritmetika Python.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __str__(self):
return f"Vector({self.x}, {self.y})"
# Usage
v1 = Vector(1, 2)
v2 = Vector(3, 4)
result = v1 + v2
print(result) # Output: Vector(4, 6)
Caching dengan callability
Pernah ingin menghindari pengulangan komputasi yang mahal? Dengan mengimplementasikan metode __call__, Anda dapat membuat objek berperilaku seperti fungsi yang melakukan cache hasilnya. Ini memungkinkan Anda menyimpan hasil komputasi berat dan mengembalikannya dengan cepat pada pemanggilan berikutnya, mengoptimalkan kinerja dan menghemat waktu pemrosesan yang berharga.
class CachedComputation:
def __init__(self):
self.cache = {}
def __call__(self, x):
if x not in self.cache:
self.cache[x] = self._expensive_computation(x)
return self.cache[x]
def _expensive_computation(self, x):
# Imagine a complex calculation here
return x ** 2
# Usage
compute = CachedComputation()
print(compute(5)) # Computes and caches: Output: 25
print(compute(5)) # Retrieves from cache: Output: 25
Context manager kustom
Membangun context manager menggunakan metode __enter__ dan __exit__ memungkinkan Anda mengotomatiskan manajemen sumber daya. Misalnya, Anda dapat merancang context manager kustom untuk menangani operasi berkas—membuka berkas saat memasuki blok dan memastikan menutupnya saat keluar. Ini menyederhanakan kode Anda dan mencegah kesalahan umum seperti kebocoran sumber daya.
class FileHandler:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close()
# Usage
with FileHandler("example.txt", "r") as file:
content = file.read()
print(content)
Iterable dan kontainer kustom
Agar kontainer kustom Anda bekerja dengan loop dan komprehensi Python, implementasikan protokol iterasi dengan mendefinisikan metode seperti __iter__ dan __next__. Baik Anda membangun stack, queue, atau kontainer lain yang kustom, metode ini memungkinkan objek Anda di-loop layaknya list biasa, meningkatkan fleksibilitas dan kegunaan kelas Anda.
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def __iter__(self):
self.index = 0
return self
def __next__(self):
if self.index >= len(self.items):
raise StopIteration
item = self.items[self.index]
self.index += 1
return item
# Usage
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
for item in stack:
print(item) # Output: 1, 2, 3
Untuk selengkapnya tentang iterable kustom dan perilaku kontainer, lihat Python Lists Tutorial dan Python List Functions & Methods Tutorial and Examples.
Praktik Terbaik dengan Metode Dunder
Kapan dan bagaimana menimpa metode dunder adalah hal yang penting. Berikut beberapa pedoman yang perlu diingat:
Kapan menimpa
Hanya timpa metode dunder jika Anda perlu menyesuaikan perilaku. Misalnya, jika Anda ingin objek Anda mendukung aritmetika atau pemeriksaan kesetaraan dengan cara tertentu, maka layak mengimplementasikan metode seperti __add__ atau __eq__.
Konsistensi
Jika Anda menimpa satu metode, seperti __eq__ untuk pemeriksaan kesetaraan, perbarui metode terkait seperti __hash__ sesuai kebutuhan. Konsistensi ini memastikan objek Anda berperilaku benar dalam koleksi seperti set atau dictionary.
Hindari penggunaan berlebihan
Tahan godaan untuk membuat nama dunder baru di luar model data Python standar. Berpegang pada kumpulan metode dunder bawaan menjaga kode Anda tetap jelas dan mencegah perilaku yang tidak terduga.
Pertimbangan kinerja
Ingat bahwa terlalu sering menimpa metode dunder, terutama di bagian kode yang sering dijalankan, dapat memengaruhi kinerja. Upayakan implementasi yang efisien untuk menghindari perlambatan pada operasi berfrekuensi tinggi.
Kesimpulan dan Sumber Lanjutan
Metode dunder memberdayakan kelas Python Anda untuk berinteraksi mulus dengan fitur bawaan bahasa, membuat kode Anda lebih bersih dan intuitif. Metode ini memungkinkan objek Anda menangani segala hal mulai dari aritmetika dan perbandingan hingga manajemen atribut kustom tanpa upaya ekstra dari Anda. Anda sebaiknya bereksperimen dengan metode-metode ini dalam proyek Anda dan lihat bagaimana metode ini dapat menyederhanakan operasi yang kompleks.
Untuk informasi lebih mendalam, lihat dokumentasi model data Python resmi. Anda juga akan menemukan sumber daya DataCamp kami bermanfaat:
- Python Developer career track – Tingkatkan keahlian Python Anda secara keseluruhan.
- Introduction to Python course – Titik awal yang bagus untuk mempelajari dasar-dasar Python.
- Python Lists Tutorial – Dalami struktur data dan pelajari lebih lanjut tentang tipe bawaan Python yang kuat.
- Python lambda Tutorial – Jelajahi pemrograman fungsional di Python.
Penulis teknis yang mengkhususkan diri pada AI, ML, dan ilmu data, membuat gagasan kompleks menjadi jelas dan mudah diakses.

