- Mahasiswa mampu mengimplementasikan prinsip polymorphism menggunakan inheritance di Python.
- Mahasiswa mampu mengimplementasikan prinsip polymorphism menggunakan duck typing di Python.
- Mahasiswa mampu menggunakan abstract class sesuai kebutuhan.
- Platform: Python 3.10+
- Bahasa: Python
- Editor/IDE yang disarankan:
- VS Code + Python Extension
- Terminal
-
Clone repositori project
oop-polymorphism-pythonke direktori lokal Anda:git clone https://github.com/USERNAME/oop-polymorphism-python.git cd oop-polymorphism-python -
Buat dan aktifkan virtual environment:
python -m venv .venv source .venv/bin/activate # Linux/macOS .venv\Scripts\activate # Windows
-
Install dependensi:
pip install -r requirements.txt
-
Jalankan unit test:
pytest
PERINGATAN: Lakukan push ke remote repository hanya jika seluruh unit test telah berhasil dijalankan (semua hijau).
Lokasi: src/pet_parade/
-
Buat kelas abstrak
Hewandisrc/pet_parade/hewan.py:- Atribut privat
_nama: str - Properti
nama(getter & setter) - Metode abstrak
bersuara(self) -> str
- Atribut privat
-
Turunan:
Kucing: implementasibersuara()→"Meong"Anjing: implementasibersuara()→"Guk"
-
Buat kelas
ParadeHewandisrc/pet_parade/parade.py:-
Atribut privat
_list_hewan: list[Hewan] -
Metode:
-
tambah_hewan(self, hewan: Hewan) -> None -
hapus_hewan(self, hewan: Hewan) -> None -
mulai_parade(self, putaran: int) -> list[str]-
Mengembalikan daftar string dengan format:
"{namaHewan} bersuara: {suaraHewan}" -
Ulangi sesuai jumlah
putaran.
-
-
-
-
Tambahkan blok demo
if __name__ == "__main__":untuk menampilkan hasil.
Lokasi: src/music_studio/
-
Kelas abstrak
Instrumendisrc/music_studio/instrumen.py:- Atribut privat
_nama: str - Properti
nama(getter & setter) - Metode abstrak
mainkan(self) -> str
- Atribut privat
-
Turunan:
Gitar:mainkan()→"tring tring"Piano:mainkan()→"tink tink"
-
Kelas
StudioMusikdisrc/music_studio/studio.py:-
Atribut privat
_list_instrumen: list[Instrumen] -
Metode:
-
tambah_instrumen(self, instrumen: Instrumen) -> None -
mainkan_instrumen(self) -> list[str]→ hasil berupa daftar string:"{namaInstrumen} berbunyi: {suaraInstrumen}"
-
-
-
Tambahkan blok demo
if __name__ == "__main__":.
Lokasi: src/arts/
-
Kelas abstrak
KaryaSenidisrc/arts/karya_seni.py:-
Atribut privat
_judul: str -
Properti
judul -
Metode abstrak:
deskripsi(self) -> strtampilkan(self) -> str
-
-
Turunan:
-
Lukisan:deskripsi()→"Sebuah gambar yang dilukis di atas kanvas"tampilkan()→"Digantung di dinding"
-
Patung:deskripsi()→"Sebuah objek tiga dimensi yang dibentuk"tampilkan()→"Diletakkan di atas meja atau lantai"
-
-
Kelas
StudioSenidisrc/arts/studio.py:-
Atribut privat
_list_karya: list[KaryaSeni] -
Metode:
-
tambah_karya_seni(self, karya: KaryaSeni) -> None -
tampilkan_semua_karya(self) -> list[str]- Mengembalikan list string hasil pemanggilan
tampilkan()semua karya.
- Mengembalikan list string hasil pemanggilan
-
-
-
Tambahkan blok demo
if __name__ == "__main__":.
Lokasi: src/notify/
-
Buat kelas
Notifierdisrc/notify/notifier.py:-
Menyimpan daftar “pengirim” bebas tipe (
list[Any]). -
Metode:
tambah_pengirim(self, pengirim) -> None→ simpan objek apa pun (tanpa pewarisan/ABC).kirim(self, pesan: str) -> list[str]→ untuk setiap pengirim, jika objek memiliki metodekirim(pesan: str) -> str, panggil dan kumpulkan hasilnya; jika tidak punya, abaikan objek tersebut.
-
-
Buat beberapa pengirim di modul terpisah:
src/notify/email_sender.py→EmailSender.kirim(self, pesan) -> strmengembalikan"Email terkirim: {pesan}".src/notify/sms_sender.py→SmsSender.kirim(self, pesan) -> strmengembalikan"SMS terkirim: {pesan}".src/notify/push_sender.py→PushSender.kirim(self, pesan) -> strmengembalikan"Push terkirim: {pesan}".- Tambahkan contoh kelas tanpa
kirim()(mis.BrokenSender) untuk menunjukkan objek tersebut diabaikan.
-
Demo
if __name__ == "__main__":dinotifier.py: daftarkan berbagai pengirim, panggilkirim("Halo"), dan cetak seluruh hasil.
Lokasi: src/render/
-
Buat kelas
ShapeRendererdisrc/render/renderer.py:-
Menyimpan daftar “bentuk” bebas tipe (
list[Any]). -
Metode:
tambah_bentuk(self, bentuk) -> None→ simpan objek apa pun.render_semua(self) -> list[str]→ iterasi semua objek; jika objek memiliki metoderender() -> str, panggil dan kumpulkan hasilnya; selain itu abaikan.
-
-
Buat beberapa bentuk (tanpa harus saling mewarisi):
src/render/lingkaran.py→Lingkaran(radius)denganrender()mengembalikan"Render Lingkaran (r={radius})".src/render/persegi.py→Persegi(sisi)denganrender()mengembalikan"Render Persegi (s={sisi})".src/render/segitiga.py→Segitiga(alas, tinggi)denganrender()mengembalikan"Render Segitiga (a={alas}, t={tinggi})".- Tambahkan contoh kelas
BukanBentuktanparender()untuk menunjukkan objek tersebut diabaikan.
-
Demo
if __name__ == "__main__":direnderer.py: tambahkan beberapa bentuk dan cetak hasilrender_semua().
Lokasi: src/extra/extra.py
Buat soal dan implementasi Anda sendiri menggunakan polymorphism:
- Tentukan kelas abstrak + kelas turunan.
- Lengkapi dengan atribut, properti, metode, validasi.
- Gunakan prinsip polymorphism (panggil metode abstrak via referensi ke kelas induk) dan/atau duck typing sesuai kebutuhan.
- Tambahkan demo
if __name__ == "__main__":.
=== Selesai ===