Di dunia pemrograman Python yang luas, ada serangkaian fitur yang sering luput dari perhatian pemula, namun memiliki arti penting yang signifikan dalam ekosistem bahasa tersebut.
Metode ajaib adalah seperangkat metode pradefinites dengan Python yang menyediakan fitur sintaksis khusus. Mereka mudah dikenali dengan tanda hubung ganda di awal dan akhir, seperti __init__, __call__, __len__
… dll.
Metode ajaib memungkinkan objek khusus berperilaku mirip dengan tipe Python bawaan.
Pada artikel ini, kita akan fokus pada fungsi dunder yang kuat. Kami akan mengeksplorasi tujuan mereka dan mendiskusikan penggunaannya.
Apakah Anda seorang pemula Python atau programmer berpengalaman, artikel ini bertujuan untuk memberi Anda pemahaman yang komprehensif tentang fungsi Dunder, membuat pengalaman pengkodean Python Anda lebih efisien dan menyenangkan.
Ingat, keajaiban Python tidak hanya terletak pada kesederhanaan dan keserbagunaannya, tetapi juga pada fitur-fiturnya yang kuat seperti fungsi Dunder.
Mungkin fungsi dunder paling dasar dari semuanya. Ini adalah metode ajaib yang secara otomatis dipanggil oleh Python setiap kali kita membuat (atau seperti namanya, menginisialisasi) objek baru.__init__
pizza kelas:
def __init__(self, size, topping):
diri.ukuran = ukuran
self.toppings = topping
# Sekarang mari kita membuat pizza
my_pizza = Pizza('besar', ['pepperoni', 'jamur'])
print(my_pizza.size) # Ini akan mencetak: besar
print(my_pizza.toppings) # Ini akan mencetak: ['pepperoni', 'mushrooms']
Dalam contoh ini, kelas bernama Pizza dibuat. Kami menyiapkan fungsi __init__ kami untuk menyertakan parameter yang akan ditentukan pada waktu inisialisasi, dan menetapkannya sebagai properti untuk objek kustom kami.
Di sini, ini digunakan untuk mewakili instance kelas. Jadi saat kita menulis self.size = size, kita berkata, "Hei, objek pizza ini memiliki ukuran atribut size
, dan saya ingin ukurannya berapa pun yang saya berikan saat membuat objek”.
Ini adalah metode ajaib Python yang memungkinkan kita melakukannya defiselesaikan deskripsi untuk item kustom kami.
Saat Anda mencetak objek atau mengonversinya menjadi string menggunakan str()
, Python periksa apakah sudah defiSaya telah menemukan sebuah metode __str__
untuk kelas objek itu.
Jika demikian, gunakan metode itu untuk mengonversi objek menjadi string.
Kita dapat memperluas contoh Pizza kita untuk menyertakan sebuah fungsi __str__
sebagai berikut:
kelas Pizza: def __init__(self, size, topping): self.size = size self.toppings = topping def __str__(self): kembalikan f"A {self.size} pizza dengan {', '.join(self.toppings )}" my_pizza = Pizza('large', ['pepperoni', 'mushrooms']) print(my_pizza) # Ini akan mencetak: Pizza besar dengan pepperoni, jamur
__repr__
Fungsi __str__ lebih merupakan cara informal untuk mendeskripsikan properti suatu objek. Di sisi lain, __repr__ digunakan untuk memberikan deskripsi objek khusus yang lebih formal, terperinci, dan tidak ambigu.
Jika Anda menelepon repr()
pada objek atau Anda cukup mengetikkan nama objek ke dalam konsol, Python akan mencari metode __repr__
.
Se __str__
bukan itu definite, Python akan digunakan __repr__
sebagai cadangan saat mencoba mencetak objek atau mengubahnya menjadi string. Jadi itu sering kali merupakan ide yang bagus defimenyelesaikan setidaknya __repr__
, bahkan jika Anda tidak melakukannya defibagus __str__
.
Inilah cara kami bisa defimenyelesaikan __repr__
untuk contoh pizza kami:
pizza kelas:
def __init__(self, size, topping):
diri.ukuran = ukuran
self.toppings = topping
def __repr__(diri sendiri):
kembalikan f"Pizza('{self.size}', {self.toppings})"
my_pizza = Pizza('besar', ['pepperoni', 'jamur'])
print(repr(my_pizza)) # Ini akan mencetak: Pizza('besar', ['pepperoni', 'jamur'])
__repr__
memberi Anda string yang dapat Anda jalankan sebagai perintah Python untuk membuat ulang objek pizza, sedangkan __str__
memberi Anda deskripsi yang lebih manusiawi. Saya harap ini membantu Anda mengunyah metode dunder ini sedikit lebih baik!
Dalam Python, kita semua tahu bahwa menambahkan angka dapat dilakukan dengan menggunakan operator +
, Seperti 3 + 5
.
Tetapi bagaimana jika kita ingin menambahkan instance dari beberapa objek khusus?
Fungsi dunder __add__
itu memungkinkan kita untuk melakukan hal itu. Ini memberi kita kemampuan untuk defimenyelesaikan perilaku operator +
pada item pribadi kami.
Demi kepentingan konsistensi, anggaplah kita menginginkannya defimenyelesaikan perilaku +
pada contoh pizza kami. Katakanlah setiap kali kita menambahkan dua atau lebih pizza bersama-sama, semua toppingnya akan digabungkan secara otomatis. Berikut tampilannya:
pizza kelas:
def __init__(self, size, topping):
diri.ukuran = ukuran
self.toppings = topping
def __add__(diri sendiri, lainnya):
jika bukan isinstance(lainnya, Pizza):
raise TypeError("Anda hanya dapat menambahkan Pizza lain!")
new_topping = self.topping + other.topping
kembalikan Pizza (ukuran sendiri, topping_baru)
# Ayo buat dua pizza
pizza1 = Pizza('besar', ['pepperoni', 'jamur'])
pizza2 = Pizza('besar', ['zaitun', 'nanas'])
# Dan sekarang mari kita "tambahkan" mereka
gabungan_pizza = pizza1 + pizza2
print(combined_pizza.toppings) # Ini akan mencetak: ['pepperoni', 'jamur', 'zaitun', 'nanas']
Demikian pula untuk dunder __add__
, kita juga bisa defimenyelesaikan fungsi aritmatika lainnya seperti __sub__
(dengan pengurangan menggunakan operator -
) Dan __mul__
(untuk perkalian menggunakan operator *
).
Metode dunder ini memungkinkan kita untuk defimenyelesaikan apa fungsinya len()
harus kembali untuk barang-barang kami yang disesuaikan.
penggunaan Python len()
untuk mendapatkan panjang atau ukuran struktur data seperti daftar atau string.
Dalam konteks contoh kita, kita dapat mengatakan bahwa "panjang" pizza adalah jumlah topping yang dimilikinya. Inilah cara kami dapat mengimplementasikannya:
pizza kelas:
def __init__(self, size, topping):
diri.ukuran = ukuran
self.toppings = topping
def __len__(diri sendiri):
kembalikan len(self.toppings)
# Ayo buat pizza
my_pizza = Pizza('besar', ['pepperoni', 'jamur', 'zaitun'])
print(len(my_pizza)) # Ini akan mencetak: 3
Dalam metode __len__, kami hanya mengembalikan panjang daftar toppings
. Sekarang, len(my_pizza)
itu akan memberi tahu kita berapa banyak topping yang ada di dalamnya my_pizza
.
Metode dunder ini memungkinkan objek menjadi iterable, yaitu dapat digunakan dalam for loop.
Untuk melakukan ini, kita juga harus defimenyelesaikan fungsi __next__
, Ini digunakan untuk defiselesaikan perilaku yang harus mengembalikan nilai berikutnya dalam iterasi. Itu juga harus menandakan iterable jika tidak ada lagi elemen dalam urutan. Kami biasanya mencapai ini dengan melemparkan pengecualian StopIteration
.
Untuk contoh pizza kita, katakanlah kita ingin mengulangi toppingnya. Kita bisa membuat kelas Pizza kita bisa diulang definendo sebuah metode __iter__
:
pizza kelas:
def __init__(self, size, topping):
diri.ukuran = ukuran
self.toppings = topping
def __iter__(diri sendiri):
diri.n = 0
kembalikan diri
def __next__(diri sendiri):
jika self.n < len(self.topping):
result = self.topping[self.n]
diri.n += 1
hasil kembali
lain:
menaikkan StopIteration
# Ayo buat pizza
my_pizza = Pizza('besar', ['pepperoni', 'jamur', 'zaitun'])
# Dan sekarang mari kita mengulanginya
untuk topping di my_pizza:
cetak (topping)
Dalam hal ini, for loop memanggil __iter__
, yang menginisialisasi penghitung (self.n)
dan mengembalikan objek pizza itu sendiri (self)
.
Kemudian, untuk panggilan loop __next__
untuk mendapatkan setiap topping pada gilirannya.
Ketika __next__
mengembalikan semua bumbu, StopIteration
itu melempar pengecualian dan for loop sekarang tahu bahwa tidak ada lagi topping dan akan membatalkan proses iterasi.
Ercole Palmeri
Operasi oftalmoplasti menggunakan penampil komersial Apple Vision Pro dilakukan di Poliklinik Catania…
Mengembangkan keterampilan motorik halus melalui mewarnai mempersiapkan anak untuk keterampilan yang lebih kompleks seperti menulis. Mewarnai…
Sektor angkatan laut adalah kekuatan ekonomi global sejati, yang telah menuju pasar 150 miliar...
Senin lalu, Financial Times mengumumkan kesepakatan dengan OpenAI. FT melisensikan jurnalisme kelas dunianya…