Skip to main content

PRAKTIKUM : Hands On

Week 4 OOP Paradigm Concepts

Mata Kuliah: Pemrograman Berorientasi Object


Pada kesempatan ini, kita akan mempelajari beberapa hal terkait pemograman lanjutan python seperti:

  1. Object Oriented Programming (OOP) di Python
  2. Modular Code
  3. Efficiency Code
  4. Best Practice dalam Python Coding

Object Oriented Programming (OOP) di Python

Object Oriented Programming atau yang biasa disingkat dengan OOP adalah suatu paradigma pemograman yang berfokus pada objek. Dalam pemograman OOP, kita memandang suatu program berisikan objek-objek yang saling mendukung dan berinteraksi satu sama lain. Tidak semua bahasa pemograman dapat mendukung paradigma pemograman ini dan Python adalah salah satu bahasa pemograman yang mendukung OOP.

Week 4 - Main Principles of OOP

Enkapsulasi

class User:
def __init__(self, username, email, gender):
self._username = username # Enkapsulasi dengan menggunakan underscore (_)
self._email = email
self._gender = gender

def get_username(self):
return self._username

def set_username(self, username):
# Validasi atau logika tambahan dapat ditambahkan di sini
self._username = username
# Contoh penggunaan
user = User("Jonathan Adis Pratama", "Jonathan@example.com", "Male")
print(user.get_username()) # Mengakses melalui metode getter
user.set_username("Jo saja") # Mengubah melalui metode setter
print(user.get_username())
  1. Enkapsulasi digunakan untuk menyembunyikan implementasi internal dan melindungi atribut agar tidak dapat diakses atau diubah secara langsung.
  2. Atribut username, email, dan gender diberi awalan _ untuk menandakan bahwa seharusnya diakses secara terbatas.
  3. Metode getter get_username digunakan untuk mengakses nilai atribut, dan setter set_username digunakan untuk mengubahnya dengan validasi atau logika tambahan.

Hands On

dari program diatas kita bisa mengubah username menggunakan method get dan set, lalu bagaimana jika saya ingin mengubah gender "Male" dari user Jonathan menjadi "unknown"???

class User:
def __init__(self, username, email, gender):
... # Enkapsulasi dengan menggunakan underscore (_)
...
...

def get_username(self):
return ...

def set_username(self, username):
# Validasi atau logika tambahan dapat ditambahkan di sini
...
user = User("...", "...", "...")
print(user...()) # Mengakses melalui metode getter
user....("...") # Mengubah melalui metode setter
print(user...())

Inheritance

Dalam OOP, dikenal suatu istilah yang bernama inheritance atau pewarisan. Istilah ini mengisyaratkan bahwa kita dapat membuat suatu kelas baru yang berasal dari turunan kelas yang lain.

Kelas yang merupakan turunan (atau children/anak) dari kelas lainnya (biasa disebut dengan parent) akan mewarisi attribut dan method yang berasal dari parentnya.

Child class juga dapat melakukan overriding terhadap method yang terdapat dari parent class.

class PremiumUser(User):
def __init__(self, username, email, gender, premium_level):
super().__init__(username, email, gender)
self.premium_level = premium_level

def display_premium_info(self):
print("Premium Level:", self.premium_level)
premium_user = PremiumUser("Jonathan Adis Pratama", "Jonathan@example.com", "Male", "Gold")
premium_user.display_premium_info()
  1. Inheritance memungkinkan kelas anak (PremiumUser) untuk mewarisi atribut dan metode dari kelas induk (User).
  2. Melalui super().__init__, konstruktor kelas anak memanggil konstruktor kelas induk untuk menginisialisasi atribut yang sama.
  3. Kelas anak dapat menambahkan metode tambahan seperti display_premium_info

Polymorphism

class User:
def __init__(self, username, email, gender):
self.username = username
self.email = email
self.gender = gender

def display_user_info(self):
print("Username:", self.username)
print("Email:", self.email)
print("Gender:", self.gender)

class PremiumUser(User):
def __init__(self, username, email, gender, premium_level):
super().__init__(username, email, gender)
self.premium_level = premium_level

def display_user_info(self): # Override metode display_user_info dari kelas User
super().display_user_info() # Memanggil metode display_user_info dari kelas induk
print("Premium Level:", self.premium_level)
def display_user_information(user):
if isinstance(user, User):
user.display_user_info()
else:
print("Objek tidak dikenali.")
# Contoh penggunaan
user1 = User("Jonathan Adis Pratama", "Jonathan@example.com", "Male")
user2 = PremiumUser("Jonathan Adis Pratama", "Jonathan@example.com", "Male", "Gold",)

display_user_information(user1) # Memanggil metode display_user_info dari kelas User
display_user_information(user2) # Memanggil metode display_user_info dari kelas PremiumUser

Dalam contoh code, display_user_information berperan seperti remote kontrol tersebut. Meskipun kita mungkin memiliki objek dari kelas User dan PremiumUser, fungsi ini mampu "mengendalikan" keduanya dengan cara yang sama, yaitu memanggil metode display_user_info. Hal ini mencerminkan prinsip polimorfisme di mana suatu fungsi dapat bekerja dengan objek-objek yang berbeda dengan menggunakan antarmuka yang seragam.

Dengan polimorfisme, kita dapat menulis kode yang lebih fleksibel dan mudah diubah, karena tidak perlu tahu tipe objek secara spesifik, tetapi cukup tahu bahwa objek tersebut memiliki antarmuka yang diperlukan.

Abstraction

import abc
print(dir(abc))
  • ABC digunakan untuk membuat kelas abstrak, yaitu kelas yang tidak bisa langsung dibuat objeknya.
  • abstractmethod digunakan untuk mendeklarasikan method abstrak, yaitu method yang harus diimplementasikan oleh subclass.
from abc import ABC, abstractmethod

# Kelas abstrak (abstraksi) untuk jenis mobil
class JenisMobil(ABC): #kelas yang diwarisi oleh ABC
def __init__(self, nama, warna):
self.nama = nama
self.warna = warna

@abstractmethod
def informasi(self):
pass

# Kelas turunan yang mengimplementasikan metode abstrak dari JenisMobil
class Sedan(JenisMobil):
def informasi(self):
return f"Sedan {self.nama} berwarna {self.warna}"

# Kelas turunan lainnya
class SUV(JenisMobil):
def informasi(self):
return f"SUV {self.nama} berwarna {self.warna}"

# Fungsi untuk menampilkan informasi mobil
def tampilkan_informasi(mobil):
print(mobil.informasi())
# Contoh penggunaan
sedan_mobil = Sedan("Civic", "Merah")
suv_mobil = SUV("CR-V", "Hitam")

tampilkan_informasi(sedan_mobil)
tampilkan_informasi(suv_mobil)

A. Abstraksi:

  • Kelas abstrak JenisMobil menyediakan kerangka kerja untuk jenis mobil apa pun. Atribut seperti nama dan warna adalah aspek-aspek abstrak yang relevan untuk semua jenis mobil.
  • Metode abstrak informasi memungkinkan setiap kelas turunan untuk memberikan implementasi khususnya sesuai dengan jenis mobil yang mereka wakili.

B. Penggunaan Abstraksi:

  • Penggunaan fungsi tampilkan_informasi menunjukkan bagaimana kita dapat menggunakan antarmuka umum (informasi) untuk menampilkan informasi mobil tanpa perlu tahu detail implementasinya.
  • Pengguna luar hanya perlu tahu bahwa objek dapat memberikan informasi tentang jenis mobil, dan detail implementasi dikurangi.

Hands On

Buatlah program yang mengandung 2/3 Main Principles of OOP selain contoh diatas. Lalu presentasikan kedepan satu-satu