4 pillar pemrograman berorientasi objek Python

97 / 100

Object Oriented Programming (OOP) atau pemrograman berorientasi objek adalah salah satu pendekatan paling efektif dalam menulis kode suatu software. Pada OOP kita menulis class yang merepresentasikan suatu situasi seperti pada keadaan sebenarnya dan kita dapat membuat suatu objek berdasarkan class tersebut. Sebelum memulai mengenai OOP pada Python, ada baiknya memahami dasar pemrograman Python terlebih dahulu. Tunggu apa lagi, mari kita mulai!!!

Jika Anda ingin download file jupyter notebook. Silahkan menuju bagian kesimpulan.

Konsep pemrograman berorientasi objek

Python adalah bahasa pemrograman berorientasi objek. Tidak seperti pada pemrograman berorientasi prosedural, di mana penekanan utama adalah pada fungsi(walaupun Python dapat melakukannya). Sedangkan pemrograman berorientasi objek lebih menekankan pada suatu objek

Kita pasti bertanya-tanya apa perbedaan antara pemrograman prosedural dan berorientasi objek. Untuk menghilangkan keraguan tersebut, mari kita bahas di antara kedua nya. Pada pemrograman prosedural, seluruh kode ditulis dalam satu prosedur yang panjang meskipun mungkin mengandung suatu fungsi dan subrutin. Dengan menggunakan cara tersebut, akan sangat sulit untuk di kelola di kemudian hari. Karena, data dan logika di campur bersama-sama.

Namun, ketika kita berbicara mengenai pemrograman berorientasi objek, kode program di bagi lagi menjadi suatu objek tersendiri.

Setiap objek mewakili bagian yang berbeda dari suatu program, dimana objek tersebut memiliki data dan logika tersendiri untuk saling berkomunikasi. Kita dapat membayangkan suatu situs web yang memiliki objek yang berbeda-beda seperti tulisan, gambar, video, dll.

Pemrograman berorientasi objek mencakup empat pillar utama, yaitu Encapsulation, Inheritance, Polymorphism dan Abstraction. Mari kita pahami topik ini secara lebih detail pada bagian selanjutnya.

Video penjelasan konsep pemrograman berorientasi objek:

[Pemrograman berorientasi objek Python] Konsep OOP

Youtube Playlist mengenai OOP pada Python

Objek, Class, Attribute dan Metode

Objek adalah suatu kumpulan data (variabel) dan metode (fungsi) yang bekerja pada data tersebut. Sedangkan, class adalah blueprint dari suatu objek. Lalu, bagaimana class memungkinkan untuk dapat mengelompokkan suatu data dan fungsi secara logis dengan cara yang mudah digunakan kembali serta bagaimana cara membangunnya jika diperlukan?

Kita dapat membayangkan class adalah sketsa dari sebuah rumah. Yang secara detail berisi mengenai lantai, pintu, jendela, dll. Berdasarkan uraian tersebut kita dapat membangun sebuah rumah. Maka, rumah adalah suatu objek.

Objek dan class pemrograman berorientasi objek
[Pemrograman berorientasi objek Python] Objek dan Class

Karena banyak rumah dapat di bangun dari sketsa tersebut. Sehingga, kita dapat membuat banyak objek dari suatu class jika dianalogikan pada pemrograman berorientasi objek. Selain itu, objek pun dapat disebut sebagai turunan dari suatu class. Proses pembuatan objek ini disebut sebagai instantiation.

Dengan menggunakan class, program yang kita tulis akan lebih konsisten. Sehingga, dapat menjadikannya lebih rapih dan efisien.

Class memiliki suatu atribut, yaitu data yang terdapat di dalamnya (variable class dan instance variable) serta metode yang dapat di akses dengan tanda titik ( . )

  • Class variable yaitu variabel yang dapat di akses oleh semua objek / instance pada kelas yang berbeda.
  • Instance variable ialah variabel khusus untuk setiap instance yang didefinisikan di dalam suatu metode dan hanya dimiliki oleh instance kelas yang digunakan pada saat itu.
  • Methods adalah fungsi yang didefinisikan di dalam kelas serta menggambarkan perilaku suatu objek.

Syntax untuk mendeskripsikan suatu class:

class NamaSuatuClass:
    pernyataan-1
    pernyataan-2
    .
    .
    .
    pernyataan-N
class Rumah():
    #Instance attribute
    def __init__(self,bahan,harga,lokasi): 
        # self adalah instance dari class
        self.bahan = bahan 
        self.harga = harga
        self.lokasi = lokasi
        
#membuat objek 
rumah1 = Rumah("Kayu",700000000,"desa") 
rumah2 = Rumah("Beton",1500000000,"tengah kota")
print(rumah1)

#Output:
<__main__.Rumah object at 0x0000019371D149C8>

Output di atas memberitahukan kepada kita bahwa rumah merupakan suatu objek pada lokasi memory tertentu pada komputer. Untuk mengakses nilai atribut tersebut, kita perlu menggunakan dot ( . ), lalu memanggil atribut yang ingin diketahui nilainya, seperti pada contoh di bawah ini:

rumah1.bahan

#output:
'Kayu'
rumah1.harga

$output:
700000000

Untuk mencetak seluruh nilai atribut dari suatu object "rumah1" terhadap parameter yang telah diketahui (bahan, harga, lokasi), kita dapat menggunakan __dict__ "dictionary".

rumah1.__dict__

#output:
{'bahan': 'Kayu', 'harga': 700000000, 'lokasi': 'desa'}

Perlu diperhatikan bahwa self juga merupakan instance dari suatu class. Oleh karena instance suatu kelas memiliki nilai yang berbeda-beda kita dapat menyatakan Rumah.harga = harga daripada self.harga = harga. Namun, karena setiap rumah tidak memiliki harga yang sama, kita harus menetapkan nilai yang berbeda untuk contoh yang berbeda. Oleh karena itu diperlukan variable khusus self yang dapat membantu kita untuk melacak contoh individu dari setiap kelas.

catatan [Pemrograman berorientasi objek]: Variable khusus tidak harus menggunakan kata self. Penggunaan self dimaksudkan untuk standarisasi penulisan class pada Python agar dapat dipahami oleh seluruh Python programmer untuk keseragaman penulisan kode.

Encapsulation

Encapsulation adalah salah satu konsep fundamental pada pemrograman berorientasi objek. Encapsulation menggambarkan suatu ide untuk membungkus data dan metode yang bekerja pada suatu data di dalam satu unit. Hal ini memberikan batasan dalam mengakses suatu variabel dan metode secara langsung. Sehingga, dapat mencegah modifikasi data yang tidak disengaja. Hal tersebut sangatlah penting, karena dapat mencegah perubahan yang tidak disengaja. Bukan tidak dapat di ubah, namun, variabel objek tersebut hanya dapat di ubah dengan metode objek.

[Pemrograman berorientasi objek Python] Metode dan Variable

Python tidak memiliki kata kunci private seperti pada bahasa pemrograman yang lain. Sebagai gantinya, hal ini dapat dilakukan oleh encapsulation. Variable class yang tidak boleh di akses secara langsung diawali oleh dua tanda garis bawah seperti pada contoh di bawah ini:

class Halo:
    def __init__(self, angka):
        self.a = 123
        self._b = 20
        self.__c = 40
        
halo = Halo("angka")
print(halo.a)
print(halo._b)
print(halo.__c)

#output:

123
20
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-40-a2c62dd721c7> in <module>
      8 print(halo.a)
      9 print(halo._b)
---> 10 print(halo.__c)
     11 

AttributeError: 'Halo' object has no attribute '__c'

Dapat diperhatikan pada contoh di atas bahwa variable a dan _ b dapat tercetak. Namun, variable __ c memberikan AttributeError.

  • Single underscore: variable private, tidak seharusnya di akses secara langsung. Namun, tidak menghentikan Python untuk mengeksekusi perintah (kecuali konvensi).
  • Double underscore: Private variable, sulit untuk di akses, namun masih memungkinkan.
  • Keduanya masih dapat di akses. Python memiliki variable private secara konvensi.

Private variable dapat di ubah dengan menggunakan metode get dan set yang dapat memberikan akses secara tidak langsung.

class Software():
    #Instance attribute
    def __init__(self):
        self.__version = 1
    
    # Instance method
    def getVersion(self):
        print(self.__version)

    def setVersion(self, version):
        self.__version = version

# instanstiate objek Software
obj = Software()
obj.getVersion()
obj.setVersion(3)
obj.getVersion()

#Output:
1
3

Dapat di lihat pada contoh di atas, bahwa, untuk mengubah software version dari 1 kepada version 3 diperlukan metode get dan set. Oleh karena itu untuk mengakses variable yang memiliki double underscore harus di ubah dengan cara yang tidak langsung, yaitu dengan mengunakan metode get dan set.

Inheritance

Inheritance memungkinkan kita untuk mewarisi atribut dan metode dari suatu kelas dasar (base)atau induk(parent). Hal ini sangat berguna karena kita membuat sub-kelas yang dapat menggunakan semua fungsi dari parent class. Selain itu, kita dapat menimpa atau menambahkan fungsi yang baru tanpa mempengaruhi parent class. Untuk memahami konsep inheritance dengan mudah, kita dapat menganalogikan sifat seorang anak mewarisi sifat orang tuanya. Sama hal nya pada Python yang memiliki dua kelas, yaitu:

  1. Parent class (super atau base class)
  2. Child class (subclass atau derived class)

Class yang mewarisi sifat disebut sebagai Child class, sedangkan class yang diwarisi sifat nya adalah Parent class.

Inheritance memiliki kemampuan untuk membuat Sub-classes yang berisi spesialisasi dari Parent class. Selanjutnya, inheritance dapat di bagi lagi menjadi empat tipe. Yaitu single, multilevel, hierarchical, dan multiple inheritance. Untuk memahaminya lebih jelas, mari kita lihat diagram di bawah ini.

Contoh inheritance pemrograman berorientasi objek
[Pemrograman berorientasi objek Python] Contoh Tipe Inheritance

Untuk memahaminya pada Python, mari kita telusuri satu persatu.

Single Inheritance

Pada inheritance, child class dapat mengakses seluruh metode yang telah didefinisikan pada parent class. Selain itu, child class dapat meliputi metode spesifik yang dimilikinya.

Dalam bahasa pemrograman berorientasi objek pada Python, class turunan dapat mewarisi class utama dengan cara memanggil kembali kelas utama di dalam tanda kurung.

Misalkan kita ingin membuat class untuk Hewan. Lalu, dari jenis hewan memiliki spesies kucing. Seperti pada contoh di bawah ini:

# Parent class
class Hewan:  
    def bicara(self):  
        print("Hewan berbicara")  
        
# Child class mewarisi dari class Hewan
class Kucing(Hewan):
    def meaow(self):  
        print("meaow....meaow....meaow..!!!") 

k = Kucing()
k.meaow()
k.bicara()

#output:
meaow....meaow....meaow..!!!
Hewan berbicara

Dapat di lihat pada contoh di atas, hewan adalah parent class dari se ekor kucing. Sehingga ketika kita menggunakan metode meaow(), maka yang keluar adalah suara kucing. Namun, ketika kita menggunakan metode bicara() pada kucing, maka yang keluar adalah suara hewan karena class Kucing dapat menggunakan metode parent class Hewan.

 Multilevel inheritance

Multilevel inheritance adalah kondisi dimana ketika suatu class mewariskan class yang lainnya. Tidak ada batasan hingga berapa banyak jumlah level yang dapat digunakan pada multilevel inheritance pada Python. Contoh syntax:

# Parent class
class Hewan:  
    def bicara(self):  
        print("Hewan berbicara")  
        
# Child class mewarisi dari class Hewan
class Kucing(Hewan):
    def meaow(self):  
        print("meaow....meaow....meaow..!!!") 
        
# Child class AnakKucing mewarisi dari class hewan
class AnakKucing(Kucing):
    def minum(self):  
        print("minum susu") 

a_k = AnakKucing()
a_k.bicara()
a_k.meaow()
a_k.minum() 

#Output:
Hewan berbicara
meaow....meaow....meaow..!!!
minum susu

Dapat di lihat pada contoh di atas, bahwa, class AnakKucing dapat mewarisi sifat dari Kucing dan Hewan.

Hierarchical Inheritance

Hierarchical inheritance memungkinkan kita menurunkan lebih dari satu child class untuk mewarisi sifat dari parent class.

# Class utama 
class Parent: 
      def fungsi1(self): 
            print("Fungsi pada parent class.") 
  
# class 1 turunan 
class Child1(Parent): 
      def fungsi2(self): 
            print("Fungsi pada child 1.") 
  
# class 2 turunan
class Child2(Parent): 
      def fungsi3(self): 
            print("Fungsi pada child 2.") 

object1 = Child1() 
object2 = Child2() 

object1.fungsi1() 
object1.fungsi2()  

object2.fungsi1() 
object2.fungsi3()

#Output:
Fungsi pada parent class.
Fungsi pada child 1.
Fungsi pada parent class.
Fungsi pada child 2.

Contoh di atas menunjukkan bahwa class turunan Child1 dan Child2 dapat menggunakan fungsi pada class parent yang sama.
Silahkan untuk mencobanya:

Multiple inheritance

Multiple inheritance memungkinkan satu kelas turunan untuk mewarisi lebih dari satu kelas utama.

## parent 1
class Perhitungan1:
    def penjumlahan(self, a, b):
        return a+b
## parent 2
class Perhitungan2:
    def perkalian(self, a, b):
        return a*b
## child    
class Child(Perhitungan1, Perhitungan2):
    def pembagian(self, a, b):
        return a/b

c = Child()

print(c.penjumlahan(20, 30))
print(c.perkalian(5, 4))
print(c.pembagian(6, 12))

#output:
50
20
0.5

Pada contoh di atas menunjukkan bahwa class Child mewarisi sifat dari dua parent class yaitu class Perhitungan1 dan Perhitungan2.

Silahkan untuk mencobanya:

Polymorphism

Polymorphism adalah kemampuan untuk mengambil bentuk yang berbeda. Polymorphism dalam Python memungkinkan kita untuk mendefinisikan metode pada child class dengan menggunakan nama yang sama seperti pada parent class.

Definisi polymorphism

Polymorphism di bangun berdasarkan dua suku kata, yaitu Poly (banyak) dan Morphism (bentuk). Artinya adalah fungsi yang sama dapat digunakan pada tipe yang berbeda. Sehingga membuat membuat programming lebih intuitif dan mudah. Dalam bahasa pemrograman berorientasi objek pada Python, kita memiliki cara-cara yang berbeda untuk mendefinisikan polymorphism.

Class child mewarisi seluruh method dari parent class. Namun, ada beberapa kasus di mana metode tersebut tidak cocok dengan child class. Oleh karena itu, kita harus mengimplementasikan kembali metode yang pada child class yang dinamakan Method Overriding. Contohnya dapat di lihat pada bagian Polymorphism dengan inheritance. (link ke bawah)

Polymorphism pemrograman berorientasi objek
[Pemrograman berorientasi objek Python] Ilustrasi polymorphism

 

Ada beberapa metode untuk menggunakan polymorphism pada pemrograman berorientasi objek Python. Kita dapat menggunakan fungsi berbeda, metode class atau objek untuk mendefinisikannya.

Polymorphism dengan function

Kita dapat membuat fungsi yang dapat mengambil objek apapun untuk mengimplememtasikan polymorphism.

Contoh di atas adalah menggunakan fungsi yang sudah terintegrasi pada Python yaitu len(). Fungsi tersebut dapat digunakan untuk tipe data yang berbeda. Pada kasus di atas adalah contoh untuk menghitung jumlah huruf dari string, list dan pasangan key-value pada dictonary.

Polymorphism dengan class

Kita dapat menggunakan konsep polymorphism ketika membuat metode class. Python memungkinkan class yang berbeda untuk menggunakan metode dengan nama yang sama. Kemudian kita dapat memanggil metode tersebut dengan mengabaikan objek yang sedang kita gunakan. Contoh:

class Kucing:
    def __init__(self, nama, umur):
        self.nama = nama
        self.umur = umur

    def bersuara(self):
        print("Meow")


class Dog:
    def __init__(self, nama, umur):
        self.nama = nama
        self.umur = umur

    def bersuara(self):
        print("Guk..guk...")

kucing1 = Kucing("Tom", 3)
anjing1 = Dog("Spike", 4)

for hewan in (kucing1, anjing1):
    hewan.bersuara()

# Output:
Meow
Guk..guk..

Kita telah membuat class Kucing dan Anjing. Keduanya memiliki struktur dan metode yang sama, yaitu bersuara().

 Polymorphism dengan Inheritance

Polymorphism pada pemrograman berorientasi objek Python mendefinisikan child class yang memiliki kesamaan nama metode pada parent class. Pada inheritance, child class mewarisi metode dari parent class. Selain itu, memungkinkan untuk memodifikasi metode di dalam child class yang telah diwarisi dari parent class. Contoh polymorphism dengan Inheritance dapat dilihat pada contoh di bawah ini:

class Burung:
     def intro(self):
        print("Di dunia ini ada beberapa type berbeda dari spesies burung")
 
     def terbang(self):
        print("Hampir semua burung dapat terbang, namun ada beberapa yang tidak dapat terbang")
        
 
class Elang(Burung):
     def terbang(self):
        print("Elang dapat terbang")
    
 
class BurungUnta(Burung):
     def terbang(self):
        print("Burung unta tidak dapat terbang")
 
obj_burung = Burung()
obj_elang = Elang()
obj_burung_unta = BurungUnta()
 
obj_burung.intro()
obj_burung.terbang()
 
obj_elang.intro()
obj_elang.terbang()
 
obj_burung_unta.intro()
obj_burung_unta.terbang()

#Output:
Di dunia ini ada beberapa type berbeda dari spesies burung
Hampir semua burung dapat terbang, namun ada beberapa yang tidak dapat terbang
Di dunia ini ada beberapa type berbeda dari spesies burung
Elang dapat terbang
Di dunia ini ada beberapa type berbeda dari spesies burung
Burung unta tidak dapat terbang

Contoh di atas adalah metode overriding, dimana metode terbang() pada parent class Burung, di timpa oleh oleh masing-masing metode child class-nya yang terdapat pada class Elang dan BurungUnta.

Abstraction

Abstraction adalah pilar terakhir dari ke-empat pilar pemrograman berorientasi objek yang di bahas pada artikel ini. Abstraction memiliki tujuan untuk menyembunyikan detail yang tidak terlalu penting dari user. Kita dapat membayangkannya seperti sebuah smartphone, dimana untuk menggunakan device tersebut, kita tidak perlu memahami apa yang terjadi di dalam logika elektronik dan software di dalamnya. Namun, kita hanya perlu menekan tombol power dan menyentuh layar dengan menggunakan tangan kita agar alat tersebut bisa bekerja dengan semestinya.

Python memiliki module untuk menggunakan Abstract Base Classes (ABC). Modulenya bernama abc. Contoh kode di bawah ini adalah cara penggunaan modul abc untuk mendefinisikan abstraction.

Untuk menggunakan metode abstrak, kita harus menambahkan dekorator pada metode yang akan dijadikan abstrak dengan cara menambahkan @abstraction di atas metode tersebut. Untuk menunjukkan bahwa metode tersebut adalah abstrak. Mari kita coba untuk menjalankan code ini.

from abc import ABC, abstractmethod
class Bentuk(ABC):
    @abstractmethod
    def luas(self): 
        return self.__sisi * self.__sisi

    @abstractmethod
    def keliling(self): 
        return 4 * self.__sisi

class Persegi(Bentuk):
    def __init__(self, sisi):
        self.__sisi = sisi

persegi = Persegi(6)

#Output:
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-159-d0755e2ccceb> in <module>
     13         self.__sisi = sisi
     14 
---> 15 persegi = Persegi(6)

TypeError: Can't instantiate abstract class Persegi with abstract methods keliling, luas

Kode di atas memberikan peringatan TypeError karena metode di dalam class Bentuk yaitu area dan perimeter adalah metode yang abstrak. Perlu diperhatikan juga ketika kita menggunakan class Persegi, maka, akan menimbulkan error yang sama, karena pada kode di atas kita mewarisi parent class Bentuk pada child class Persegi. Untuk menjalankan metode tersebut, kita harus mengimplementasikan kembali metode yang ada pada parent class Bentuk agar tidak menimbulkan pesan error, seperti pada contoh di bawah ini:

from abc import ABC, abstractmethod
class Bentuk(ABC):
    @abstractmethod
    def luas(self): 
        return self.__sisi * self.__sisi

    @abstractmethod
    def keliling(self): 
        return 4 * self.__sisi

class Persegi(Bentuk):
    def __init__(self, sisi):
        self.__sisi = sisi
    def luas(self):
        return self.__sisi * self.__sisi
    def keliling(self):
        return 4 * self.__sisi


persegi = Persegi(6)
print(persegi.luas())
print(persegi.keliling())

#Output:
36
24

Kesimpulan Pemrograman berorientasi objek Python

Pada artikel ini kita telah membahas mengenai empat pilar pemrograman berorientasi objek pada Python serta contoh penggunaannya. Sehingga lebih mudah untuk memahami konsep penting dalam pemrograman berorientasi objek.

Anda dapat membaca artikel lain mengenai dasar pemrograman python. Anda pun dapat mendownload catatan mengenai OOP dalam Jupyter notebook pada link di bawah ini:


Download file OOP Dasar

Terima kasih telah meluangkan waktunya untuk membaca. Semoga memberikan suatu manfaat.

Artikel Rekomendasi:

Python Data Visualisasi dengan Seaborn
Mendeteksi Object Dengan Tensorflow
IoT Dengan Python dan Raspberry Pi
Mendeteksi Object Dengan Raspberry Pi

Referensi

https://www.programiz.com
python-textbok.readthedocs.io
Edureka
Javatpoint
Python-course.eu

 

 

Muhammad Zacky Asy'ari
Saya seorang Engineer dan Tech Entrepreneur. Memiliki ketertarikan dalam bidang Internet of Things, data acquisition, data analytics dan visualization, machine learning, software testing, serta web design dan development.
Silahkan telusuri blog ini dengan senang hati :).

Terbaru

Copyright since @ 2020
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram