Eco Techno Leader ingin membuat sistem untuk mengelola proyek energi keterbaruan, seperti panel surya atau turbin angin, menggunakan konsep OOP (Object-Oriented Programming). Sistem ini akan mencakup pembuatan class, method, inheritance, polymorphism, dan encapsulation untuk mengelola data proyek secara efisien.
Class adalah blueprint untuk objek. Kita buat class untuk proyek energi.
class ProyekEnergi:
def __init__(self, nama, kapasitas):
self.nama = nama
self.kapasitas = kapasitas
proyek1 = ProyekEnergi("Panel Surya Desa Makmur", 15000)
print(f"Nama proyek: {proyek1.nama}")
print(f"Kapasitas: {proyek1.kapasitas} watt")
Cara Copy-Paste ke VS Code:
proyek_energi.py (Ctrl+S, tambahkan ekstensi .py).python proyek_energi.py lalu Enter untuk jalankan.Hasil di Command Prompt:
Do: Gunakan __init__ untuk inisialisasi atribut objek.
Don't: Jangan lupa pake self untuk akses atribut dalam class.
Kita tambah method untuk menghitung efisiensi proyek.
class ProyekEnergi:
def __init__(self, nama, kapasitas, energi_output):
self.nama = nama
self.kapasitas = kapasitas
self.energi_output = energi_output
def hitung_efisiensi(self):
return (self.energi_output / self.kapasitas) * 100
proyek1 = ProyekEnergi("Panel Surya Desa Makmur", 15000, 12750)
efisiensi = proyek1.hitung_efisiensi()
print(f"Efisiensi {proyek1.nama}: {efisiensi}%")
Hasil di Command Prompt:
Do: Buat method dalam class untuk fungsi yang terkait dengan objek.
Don't: Jangan pake method untuk logika yang gak relevan dengan class, bikin fungsi biasa aja.
Kita buat subclass untuk jenis proyek spesifik (panel surya dan turbin angin), terapkan polymorphism, dan gunakan encapsulation untuk melindungi data.
class ProyekEnergi:
def __init__(self, nama, kapasitas, energi_output):
self.nama = nama
self.__kapasitas = kapasitas # private attribute
self.__energi_output = energi_output
def hitung_efisiensi(self):
return (self.__energi_output / self.__kapasitas) * 100
def get_kapasitas(self): # getter
return self.__kapasitas
def set_energi_output(self, energi_output): # setter
if energi_output < 0:
print("Energi output tidak boleh negatif!")
else:
self.__energi_output = energi_output
class ProyekPanelSurya(ProyekEnergi):
def __init__(self, nama, kapasitas, energi_output, jumlah_panel):
super().__init__(nama, kapasitas, energi_output)
self.jumlah_panel = jumlah_panel
def hitung_efisiensi(self): # polymorphism
efisiensi = super().hitung_efisiensi()
return efisiensi * 0.95 # efisiensi panel surya dikurangi 5% karena faktor lingkungan
class ProyekTurbinAngin(ProyekEnergi):
def __init__(self, nama, kapasitas, energi_output, kecepatan_angin):
super().__init__(nama, kapasitas, energi_output)
self.kecepatan_angin = kecepatan_angin
def hitung_efisiensi(self): # polymorphism
efisiensi = super().hitung_efisiensi()
return efisiensi * (self.kecepatan_angin / 10) # efisiensi bergantung pada kecepatan angin
# Membuat objek
proyek1 = ProyekPanelSurya("Panel Surya Desa Makmur", 15000, 12750, 50)
proyek2 = ProyekTurbinAngin("Turbin Angin Desa Sejahtera", 20000, 18000, 8)
print(f"Efisiensi {proyek1.nama}: {proyek1.hitung_efisiensi()}%")
print(f"Efisiensi {proyek2.nama}: {proyek2.hitung_efisiensi()}%")
print(f"Kapasitas {proyek1.nama}: {proyek1.get_kapasitas()} watt")
proyek1.set_energi_output(-100) # mencoba set energi output negatif
proyek1.set_energi_output(13500) # set energi output baru
print(f"Efisiensi baru {proyek1.nama}: {proyek1.hitung_efisiensi()}%")
Hasil di Command Prompt:
Do: Gunakan super() untuk memanggil method dari parent class, dan gunakan getter/setter untuk encapsulation.
Don't: Jangan akses atribut private langsung (misalnya proyek1.__kapasitas), pake getter/setter aja.