Panduan Metode Dunder Python

Keajaiban Dibalik Python

Foto oleh Chris Ried di Unsplash

Python memiliki beberapa metode ajaib — Anda biasanya akan mendengar praktisi menyebutnya sebagai metode dunder (saya akan menyebut keduanya secara bergantian) . Metode-metode ini melakukan prosedur yang dikenal sebagai operator overloading: memberikan makna yang diperluas di luar makna yang telah ditentukan sebelumnya kepada operator . Kami menggunakan overloading operasional untuk menambahkan perilaku kustom ke kelas kami sehingga kami dapat menggunakannya dengan operator Python dan fungsi bawaan.

Cara paling sederhana untuk memikirkan metode yang lebih bodoh adalah sebagai kontrak antara implementasi Anda dan juru bahasa Python. Salah satu syarat kontrak melibatkan Python melakukan beberapa tindakan di belakang layar dalam beberapa keadaan tertentu (yaitu mencoba menambahkan bilangan bulat ke kelas kustom).

Metode Dunder dimulai dan diakhiri dengan dua garis bawah: yang paling populer yang mungkin Anda temui adalah __init__()metodenya. Kami membuat __init__()metode di kelas sehingga kami dapat mengizinkan kelas untuk diinisialisasi dengan atribut tertentu dari kelas — Pelajari lebih lanjut tentang pemrograman berorientasi objek di Memulai dengan Pemrograman Berorientasi Objek di Python 3 .

Tapi __init__()hanya salah satu dari beberapa metode sihir. Dalam artikel ini, kami akan membahas berbagai jenis metode dunder yang mungkin Anda temui dan apa yang mereka lakukan.

Metode representasi string

Setiap kali kami membuat objek baru dengan Python, kami secara implisit membuat objek terkait karena semua kelas mewarisi dari Object. Metode yang didefinisikan dalam Objectdiwarisi oleh kelas kami yang baru dibuat dan digunakan dalam berbagai situasi seperti ketika sebuah objek dicetak.

class Car: 
    pass
car = Car()
print(car)
"""
<__main__.Car object at 0x7f53e19a8d90>
"""

Tetapi panggilan anak dapat menimpa kelas induk. Yang harus kita lakukan adalah membuat metode dengan nama yang sama di kelas anak — pelajari lebih lanjut tentang pewarisan di Inheritance: Getting to Grips with OOP in Python .

class Car: 
    def __repr__(self):
        return f"{self.__class__.__qualname__}"
        
car = Car()
print(car)
"""
Car
"""

Catatan : Objek kami tidak memiliki banyak hal sehingga kami akan menggunakan informasi yang sama seperti yang kami lakukan di file __repr__().

class Car: 
    def __str__(self):
        return f"{self.__class__.__qualname__}"
        
car = Car()
print(car)
"""
Car
"""

Metode matematika dunder

Saat kita membuat ekspresi, kita menggunakan simbol khusus yang dikenal sebagai operator . Jika kita ingin menggunakan operan dalam sebuah ekspresi, maka operan tersebut harus memiliki metode dunder matematika yang dapat digunakan operator untuk mengevaluasi ekspresi. Tanpa membuat metode dunder matematika, Python akan memunculkan kesalahan tipe.

class RandomNumbers: 
    def __init__(self, a, b): 
        self.a = a 
        self.b = b
        
set_a = RandomNumbers(2, 4)
set_b = RandomNumbers(3, 5)
print(set_a + set_b)
"""
Traceback (most recent call last):
  File "<string>", line 9, in <module>
TypeError: unsupported operand type(s) for +: 'RandomNumbers' and 'RandomNumbers'
"""

class RandomNumbers: 
    def __init__(self, a, b): 
        self.a = a 
        self.b = b
    
    def __add__(self, other):
        # Only permit RandomNumber objects to be added
        if not isinstance(other, RandomNumbers): 
            return NotImplemented
            
        return RandomNumbers(other.a + self.a, other.b + self.b)
    
    def __repr__(self):
        return f"{self.__class__.__qualname__}({self.a}, {self.b})"
        
set_a = RandomNumbers(2, 4)
set_b = RandomNumbers(3, 5)
print(set_a + set_b)
"""
RandomNumbers(5, 9)
"""

Dalam contoh kita, kita mencegah objek kita menambahkan objek yang bukan RandomNumberinstance. Mari kita lihat metode lain yang memungkinkan kita mengalikan bilangan dengan bilangan bulat:

class RandomNumbers: 
    def __init__(self, a, b): 
        self.a = a 
        self.b = b
    
    def __add__(self, other):
        if not isinstance(other, RandomNumbers):
            return NotImplemented
            
        return RandomNumbers(other.a + self.a, other.b + self.b)
        
    def __mul__(self, other): 
        if not isinstance(other, int): 
            return NotImplemented 
            
        return RandomNumbers(self.a * other, self.b * other)
    
    def __repr__(self):
        return f"{self.__class__.__qualname__}({self.a}, {self.b})"
        
set_a = RandomNumbers(2, 4)
print(set_a * 3)
"""
RandomNumbers(6, 12)
"""

-- snip -- 
set_a = RandomNumbers(2, 4)
print(3 * set_a)
"""
Traceback (most recent call last):
  File "<string>", line 23, in <module>
TypeError: unsupported operand type(s) for *: 'int' and 'RandomNumbers'
"""

Alasan perilaku ini adalah karena metode dunder matematika dipanggil ketika objek berada di sisi kiri operator matematika. Jika Anda ingin memperluas fungsionalitas sehingga Anda juga dapat memanggil objek di sisi kanan, maka Anda harus mendefinisikan metode dunder terbalik .

Mari kita tunjukkan ini dengan contoh perkalian kita:

class RandomNumbers:
    def __init__(self, a, b): 
        self.a = a 
        self.b = b
    
    def __add__(self, other):
        if not isinstance(other, RandomNumbers):
            return NotImplemented
            
        return RandomNumbers(other.a + self.a, other.b + self.b)
        
    def __mul__(self, other): 
        if not isinstance(other, int): 
            return NotImplemented 
            
        return RandomNumbers(self.a * other, self.b * other)
    
    def __rmul__(self, other): 
        return self.__mul__(other)
    
    def __repr__(self):
        return f"{self.__class__.__qualname__}({self.a}, {self.b})"
        
set_a = RandomNumbers(2, 4)
print(3 * set_a)
"""
RandomNumbers(6, 12)
"""

Ini hanya dua jenis metode dunder, tetapi ada beberapa — Anda dapat menemukan daftar semuanya di sini . Jika Anda tertarik untuk meningkatkan keterampilan Python Anda, saya sarankan Anda memeriksa keterampilan Python dan jalur karier yang tersedia dengan DataCamp .

Terima kasih sudah membaca.

Terhubung dengan saya:
LinkedIn
Twitter
Instagram

Jika Anda senang membaca cerita seperti ini dan ingin mendukung tulisan saya, pertimbangkan untuk menjadi anggota Medium . Dengan komitmen $5 per bulan, Anda membuka akses tak terbatas ke cerita di Medium. Jika Anda menggunakan tautan pendaftaran saya , saya akan menerima komisi kecil.

sudah menjadi anggota? Berlangganan untuk diberi tahu ketika saya menerbitkan.

Suggested posts

Mencari Informasi Tentang Nama Domain

Kutipan dari Alat Perangkat Lunak Kecil dan Tajam oleh Brian P. Hogan

Mencari Informasi Tentang Nama Domain

Saat Anda membuat permintaan ke facebook.com, komputer Anda mencari nama domain untuk menerjemahkan nama domain tersebut menjadi alamat IP sehingga komputer Anda dapat membuat koneksi tersebut.

"The Mariana Trench Unveiled: Menyingkap Kebenaran Tersembunyi yang Mengerikan dari Abyss"

"The Mariana Trench Unveiled: Menyingkap Kebenaran Tersembunyi yang Mengerikan dari Abyss"

Pendahuluan:Selamat datang, para pembaca yang pemberani, dalam sebuah perjalanan yang akan membawa kita ke kedalaman tergelap planet kita. Di blog ini, kami menyelidiki dunia penuh teka-teki Palung Mariana, mengungkap rahasianya yang tersembunyi dan mengungkap kebenaran mengerikan yang ada di bawah permukaannya.

Related posts

Kebohongan Koboi

Bagaimana perusahaan besar menjual kebohongan besar kepada orang Amerika

Kebohongan Koboi

Ini adalah pagi keemasan yang cemerlang di perbukitan barat, saat sinar pertama matahari menyinari rerumputan beku di dataran. Kawanan sapi Angus yang tenang, hitam legam dan besar, membentuk siluet melawan matahari terbit saat mereka menyusuri jalan setapak menuju lokasi yang mereka semua kenal dengan baik; bar sarapan.

Mendanai penghapusan karbon di FY24

Rincian permintaan alokasi Carbon180 di seluruh jalur

Mendanai penghapusan karbon di FY24

Oleh Alyson Lee, penasihat urusan pemerintah yang mengelola Proses alokasi tahunan pemerintah federal merupakan inti dari upaya kami untuk mendanai penghilangan karbon dioksida (CDR). Setiap tahun, Carbon180 mengajukan permintaan ke berbagai kantor kongres untuk membantu mengarahkan ke mana dolar tahun depan akan mengalir.

Jurnal Ouvert

Jurnal Ouvert

Buku Harian Terbuka: Gambar Sehari. Saya selalu terpesona oleh cerita.

HIDUP TANPA BATAS

Ketika Anda tumbuh dewasa, Anda cenderung diberi tahu bahwa dunia adalah apa adanya dan hidup Anda hanya untuk menjalani hidup Anda di dunia, tidak pernah mempertaruhkan hidup Anda, ikuti saja jalan yang ditetapkan dan pada akhirnya mati, dan cobalah untuk tidak melakukannya. hancurkan tembok terlalu banyak. Tapi itu kehidupan yang sangat terbatas.