57. PYTHON (OOP) – Magic Methods & Operator Overloading

Belajar Bahasa Python Lengkap

Magic Method adalah method spesial yang memiliki dua underscore di awal dan di akhir nama method. Magic Method disebut juga dunders. Sejauh ini yang kita temui adalah __init__, tetapi ada beberapa yang lain. Method ini digunakan untuk membuat fungsionalitas yang tidak dapat direpresentasikan seperti method pada umumya.

Contoh penggunaan pada umumnya adalah operator overloading. Hal ini berarti mendefinisikan operator-operator untuk class yang custom yang memperbolehkan operator-operator seperti + dan * untuk digunakan.

class Vektor2D:
     def init(self, x, y):
         self.x = x
         self.y = y

     def __add__(self, other):
         return Vektor2D(self.x + other.x, self.y + other.y)

pertama = Vektor2D(5, 7)
kedua = Vektor2D(3, 9)
hasil = pertama + kedua

print(hasil.x)
print(hasil.y)
=====>
8
16
=====>

Method __add__ mengizinkan operator + pada class. Seperti contoh di atas, method tersebut menambahkan atribut pada objek dan mengembalikan sebuah objek yang mengandung hasil. Ketika didefinisikan, kita dapat menambahkan dua objek pada class secara bersamaan.

Magic method lain yang umum digunakan:
__sub__ untuk
__mul__ untuk *
__truediv__ untuk /
__floordiv__ untuk //
__mod__ untuk %
__pow__ untuk **
__and__ untuk &
__xor__ untuk ^
__or__ untuk |

Operasi x + y ditranslasikan menjadi x.__add__(y). Bagaimanapun juga , jika x belum mengimplementasikan __add__ dan x dan y memiliki tipe yang berbeda, maka y.__radd__.(x) dipanggil.

class SpecialString:
     def init(self, kata):
         self.kata = kata

     def __truediv__(self, other):     
         line = "=" * len(other.kata)
         return "\n".join([self.kata, line, other.kata])

spam = SpecialString("Halo")
hello = SpecialString("Ini adalah string.")

print(spam / hello)
=====>

 Halo
 ==================
 Ini adalah string. 

=====>

Magic method untuk perbandingan:
__lt__ untuk <
__le__ untuk <=
__eq__ untuk ==
__ne__ untuk !=
__gt__ untuk >
__ge__ untuk >=

Jika __ne__ tidak diimplementasikan, dia akan mengembalikan kebalikan dari __eq__.

Beberapa magic method untuk membuat class bertindak seperti container:
__len__ untuk len()
__getitem__ untuk indexing
__setitem__ untuk set nilai index
__delitem__ untuk menghapus nilai index
__iter__ untuk perulangan melalui objek
__contains__ untuk in

Ada banyak magic method yang tidak tercakup disini, seperti __call__ untuk memanggil objek sebagai fungsi. Kemudian seperti __int__, __str__ untuk mengkonversi objek ke dalam sebuah tipe data.

import random

class VagueList:
     def init(self, cont):
         self.cont = cont

     def __getitem__(self, index):
         return self.cont[index + random.randint(-1, 1)]
     
     def __len__(self):
         return random.randint(0, len(self.cont)*2)

vague_list = VagueList(["A", "B", "C", "D", "E"])

print(len(vague_list))
print(len(vague_list))
print(vague_list[2])
print(vague_list[2])
=====>
 2
 6
 D
 C 
=====>

Kita meng-override fungsi len() untuk class VagueList untuk mengembalikan sebuah nomor acak. Fungsi indexing juga mengembalikan item acak di dalam sebuah range dari list.


LANJUTKAN BACA MATERI LENGKAP


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.