Menu
CoddyTech

Overloading Operator

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 34 dari 64.

Operator overloading memungkinkan class-mu menggunakan operator bawaan Python (+, -, *, dan sebagainya) dengan mengimplementasikan magic method khusus.

Berikut contoh class dengan overloading operator:

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 __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

Method __add__ menentukan apa yang terjadi saat kamu menggunakan operator +:

v1 = Vector(2, 3)
v2 = Vector(5, 7)
result = v1 + v2  # Memanggil v1.__add__(v2)
print(result)

Method __mul__ menentukan apa yang terjadi saat kamu menggunakan operator *:

v1 = Vector(2, 3)
scaled = v1 * 3   # Memanggil v1.__mul__(3)
print(scaled)

Output:

Vector(7, 10)
Vector(6, 9)

Tambahkan operator perbandingan:

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 __eq__(self, other):
        return self.x == other.x and self.y == other.y
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(2, 3)
v2 = Vector(2, 3)
v3 = Vector(1, 1)

print(v1 == v2)  # True, memanggil v1.__eq__(v2)
print(v1 == v3)  # False

Poin Penting: Operator overloading menggunakan magic method seperti __add__ (+), __sub__ (-), __mul__ (*), __eq__ (==) untuk menentukan cara operator bekerja dengan object-mu. Ini membuat class-mu berperilaku secara alami dengan operator bawaan Python.

challenge icon

Tantangan

Sedang

Dalam tantangan ini, kamu akan mengimplementasikan class Money yang merepresentasikan jumlah uang dengan overloading operator yang tangguh. Implementasimu akan diuji secara menyeluruh dengan rangkaian pengujian yang komprehensif.

  • money.py - Ini adalah satu-satunya file yang perlu kamu edit. File ini berisi definisi class dengan komentar TODO yang memandu implementasimu.
  • driver.py - Berisi berbagai skenario pengujian yang memvalidasi implementasimu (jangan diubah).

Implementasikan class Money dengan fitur berikut:

  1. Constructor yang menerima amount (float) dan currency (string)
  2. Penjumlahan (+) objek Money dengan mata uang yang sama
  3. Perkalian (*) dengan angka untuk mengalikan jumlahnya
  4. Perbandingan kesetaraan (==) antara objek Money
  5. Representasi string dengan format “X.XX CUR”

Coba sendiri

from money import Money

# Penangan kasus uji
test_case = input()

def test_basic_functionality():
    # Uji inisialisasi dan representasi string
    m1 = Money(10.0, "USD")
    assert str(m1) == "10.00 USD", f"__str__ method failed, got {str(m1)}"
    
    # Uji penjumlahan
    m2 = Money(20.0, "USD")
    m3 = m1 + m2
    assert str(m3) == "30.00 USD", f"Addition failed, got {str(m3)}"
    
    # Uji penjumlahan mata uang yang berbeda
    m4 = Money(20.0, "EUR")
    try:
        m5 = m1 + m4
        assert False, "Adding different currencies should raise an error"
    except ValueError as e:
        assert str(e) == "Cannot add different currencies", f"Wrong error message: {str(e)}"
    
    # Uji perkalian
    m6 = m1 * 3
    assert str(m6) == "30.00 USD", f"Multiplication failed, got {str(m6)}"
    
    # Uji kesamaan
    assert m1 == Money(10.0, "USD"), "Equality test failed"
    assert m1 != m2, "Inequality test failed"
    
    print("All basic functionality tests passed!")

def test_zero_values():
    # Uji dengan jumlah nol
    m1 = Money(0.0, "USD")
    assert str(m1) == "0.00 USD", f"Zero amount string representation failed, got {str(m1)}"
    
    # Uji penjumlahan dengan nol
    m2 = Money(10.0, "USD")
    m3 = m1 + m2
    assert str(m3) == "10.00 USD", f"Addition with zero failed, got {str(m3)}"
    
    # Uji perkalian dengan nol
    m4 = m2 * 0
    assert str(m4) == "0.00 USD", f"Multiplication by zero failed, got {str(m4)}"
    
    # Uji kesamaan dengan jumlah nol
    assert m1 == Money(0.0, "USD"), "Equality with zero amount failed"
    assert m1 != m2, "Inequality with zero amount failed"
    
    print("All zero value tests passed!")

def test_negative_values():
    # Uji dengan jumlah negatif
    m1 = Money(-10.0, "USD")
    assert str(m1) == "-10.00 USD", f"Negative amount string representation failed, got {str(m1)}"
    
    # Uji penjumlahan dengan jumlah negatif
    m2 = Money(20.0, "USD")
    m3 = m1 + m2
    assert str(m3) == "10.00 USD", f"Addition with negative amount failed, got {str(m3)}"
    
    m4 = Money(-5.0, "USD")
    m5 = m1 + m4
    assert str(m5) == "-15.00 USD", f"Addition of two negative amounts failed, got {str(m5)}"
    
    # Uji perkalian dengan skalar negatif
    m6 = m2 * -2
    assert str(m6) == "-40.00 USD", f"Multiplication by negative scalar failed, got {str(m6)}"
    
    # Uji kesamaan dengan jumlah negatif
    assert m1 == Money(-10.0, "USD"), "Equality with negative amount failed"
    assert m1 != m2, "Inequality with negative amount failed"
    
    print("All negative value tests passed!")

def test_large_values():
    # Uji dengan jumlah yang sangat besar
    m1 = Money(1000000.0, "USD")
    assert str(m1) == "1000000.00 USD", f"Large amount string representation failed, got {str(m1)}"
    
    # Uji penjumlahan dengan jumlah besar
    m2 = Money(2000000.0, "USD")
    m3 = m1 + m2
    assert str(m3) == "3000000.00 USD", f"Addition with large amounts failed, got {str(m3)}"
    
    # Uji perkalian dengan skalar besar
    m4 = m1 * 1000
    assert str(m4) == "1000000000.00 USD", f"Multiplication with large scalar failed, got {str(m4)}"
    
    print("All large value tests passed!")

def test_precision():
    # Uji dengan jumlah pecahan
    m1 = Money(10.25, "USD")
    assert str(m1) == "10.25 USD", f"Fractional amount string representation failed, got {str(m1)}"
    
    m2 = Money(10.2, "USD")
    assert str(m2) == "10.20 USD", f"Two decimal place formatting failed, got {str(m2)}"
    
    # Uji penjumlahan dengan jumlah pecahan
    m3 = Money(0.75, "USD")
    m4 = m1 + m3
    assert str(m4) == "11.00 USD", f"Addition with fractional amounts failed, got {str(m4)}"
    
    # Uji perkalian dengan skalar pecahan
    m5 = m1 * 0.4
    assert str(m5) == "4.10 USD", f"Multiplication with fractional scalar failed, got {str(m5)}"
    
    print("All precision tests passed!")

def test_type_validation():
    try:
        # Operasi ini seharusnya berjalan tanpa error
        m1 = Money(10.0, "USD")
        m2 = m1 * 2
        m3 = m1 * 2.5
        
        # Uji kesamaan dengan tipe yang berbeda
        assert (m1 == "10.00 USD") == False, "Equality with string should return False"
        assert (m1 == 10.0) == False, "Equality with number should return False"
        
        print("All type validation tests passed!")
    except Exception as e:
        print(f"Type validation test failed: {e}")

def test_currency_case_sensitivity():
    # Uji apakah mata uang peka terhadap huruf besar dan kecil
    m1 = Money(10.0, "USD")
    m2 = Money(10.0, "usd")
    
    # Mata uang seharusnya peka terhadap huruf besar dan kecil
    assert m1 != m2, "Currency comparison should be case-sensitive"
    
    # Penjumlahan mata uang dengan kapitalisasi berbeda seharusnya gagal
    try:
        m3 = m1 + m2
        assert False, "Adding different currency cases should raise an error"
    except ValueError as e:
        assert str(e) == "Cannot add different currencies", f"Wrong error message: {str(e)}"
    
    print("All currency case sensitivity tests passed!")

def test_performance():
    # Buat banyak object Money dan lakukan operasi
    base = Money(1.0, "USD")
    result = base
    
    # Lakukan 1000 penjumlahan
    for i in range(1000):
        result = result + Money(1.0, "USD")
    
    assert str(result) == "1001.00 USD", f"Performance test addition failed, got {str(result)}"
    
    # Lakukan 10 perkalian
    result = base
    for i in range(10):
        result = result * 2
    
    assert str(result) == "1024.00 USD", f"Performance test multiplication failed, got {str(result)}"
    
    print("All performance tests passed!")

# Jalankan pengujian yang sesuai berdasarkan input
if test_case == "basic_test":
    test_basic_functionality()
elif test_case == "zero_values":
    test_zero_values()
elif test_case == "negative_values":
    test_negative_values()
elif test_case == "large_values":
    test_large_values()
elif test_case == "precision":
    test_precision()
elif test_case == "type_validation":
    test_type_validation()
elif test_case == "currency_case":
    test_currency_case_sensitivity()
elif test_case == "performance":
    test_performance()
else:
    print(f"Unknown test case: {test_case}")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Python online