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) # FalsePoin 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.
Tantangan
SedangDalam 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:
- Constructor yang menerima
amount(float) dancurrency(string) - Penjumlahan (
+) objek Money dengan mata uang yang sama - Perkalian (
*) dengan angka untuk mengalikan jumlahnya - Perbandingan kesetaraan (
==) antara objek Money - 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}")Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass vs objectParameter selfmethodAtributMethod Konstruktor (__init__)Rangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan DasarFungsi super()Penimpaan MethodPewarisan BergandaUrutan Resolusi MethodRingkasan: Hierarki Karyawan7Special method
Pengantar Magic methodOverloading OperatorMagic method untuk wadahUlasan: list khusus5Polimorfisme
Meninjau Ulang Method OverridingDuck Typingclass dan method AbstrakDesain InterfaceRingkasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanMixinsMetode Statis dan Metode ClassDecorator ClassPengelola Konteks11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Property class
Variabel instance vs variabel classDekorator propertyAtribut privatRangkuman: Pengelola Rekening Bank6Enkapsulasi
Anggota Public, Protected, PrivateModifier AksesPenyembunyian InformasiDecorator Property Tingkat LanjutUlasan: Sistem Catatan Siswa12Proyek: Manajemen Perpustakaan
Ikhtisar Proyekclass Buku dan PenggunaSistem PeminjamanFitur PencarianAntarmuka AdminPengujian dan IntegrasiLatihan sendiri: Compiler Python online