Object Oriented Programming pada Python
Object Oriented Programming(OOP) merupakan suatu konsep pemrograman yang menekankan pada paradigma atau cara pandang terhadap suatu masalah berdasarkan "object". Dalam konsep OOP semua yang ada didunia ini adalah object dan direpresentasikan dalam bentuk object. Ditulisan ini kita tidak akan membahas teori OOP, yang akan dibahas hanya langsung cara implementasi konsep OOP pada Python. Untuk lebih jelasnya mengenai teori OOP silakan baca disini.
Class
Pada konsep pemrograman berbasis object, anda tidak akan asing lagi mendengar istilah class, object, attribute, behaviour, inheritance, dll. Semua itu pasti akan anda temui disemua bahasa pemrograman yang support OOP. Jika dianalogikan, class merupakan suatu tubuh dari OOP. Class merupakan abstraksi atau blueprint yang mendefinisikan suatu object tertentu. Class akan menampung semua attribute dan perilaku dari object itu. Berikut contoh implementasi class pada Python:
class Car:
color = 'black'
transmission = 'manual'
def __init__(self, transmission):
self.transmission = transmission
print('Engine is ready!')
def drive(self):
print('Drive')
def reverse(self):
print('Reverse. Please check your behind.')
Jika diperhatikan, dalam class Car
terdapat 2 attribute yaitu color = 'black'
, transmission = 'manual'
dan method yaitu drive()
, reverse()
. Method dalam konsep OOP mewakili suatu 'behaviour' dari class atau object itu sendiri. Kita akan bahas lebih detail mengenai method.
Function/Method
Fungsi method dalam konsep OOP adalah untuk merepresentasikan suatu behaviour. Dalam contoh di atas suatu object 'mobil' memiliki behaviour antara lain adalah bergerak dan mundur. Suatu method bisa juga memiliki satu atau beberapa parameter, sebagai contoh:
gear_position = 'N'
def change_gear(self, gear):
self.gear_position = gear
print('Gear positiion on: ' + self.gear_position)
Pada method change_gear()
terdapat 1 parameter yaitu gear
. Ketika method tersebut dipanggil dan anda tidak memberikan value pada parameter tersebut, maka program akan melempar error. Bagaimanapun juga parameter yang sudah didefinisikan pada suatu method harus memiliki value meskipun value tersebut None
. Cara lainnya adalah dengan mendefinisikan default value pada parameter tersebut sejak awal method tersebut dibuat:
gear_position = 'N'
def change_gear(self, gear='N'):
self.gear_position = gear
print('Gear positiion on: ' + self.gear_position)
self.change_gear()
>>> 'Gear position on: N'
self.change_gear('R')
>>> 'Gear position on: R
Jika diperhatikan, terdapat keyword self
pada salah satu parameter method di atas. Keyword self
mengacu pada Class Instance untuk mengakses attribute atau method dari class itu sendiri. Dalam bahasa pemrograman Java, terdapat keyword this
yang memiliki fungsi yang mirip dengan keyword self
pada Python. Pemberian keyword self
pada parameter awal suatu method menjadi wajib jika anda mendefinisikan method tersebut di dalam block suatu class.
Suatu method juga bisa mengembalikan suatu value ketika method tersebut dipanggil. Berikut contoh implementasinya:
def get_gear_position(self):
return self.gear_position
gear_position = self.get_gear_position()
Constructor
Pada contoh awal tentang penjelasan class, terdapat sebuah method bernama __init__()
. Method itulah yang disebut dengan constructor. Suatu constructor berbeda dengan method lainnya, karena constructor akan otomatis dieksekusi ketika membuat object dari class itu sendiri.
class Car:
color = 'black'
transmission = 'manual'
def __init__(self, transmission):
self.transmission = transmission
print('Engine is ready!')
...
honda = Car('automatic')
>>> 'Engine is ready!'
Ketika object honda dibuat dari class Car
, constructor langsung dieksekusi. Hal ini berguna jika anda membutuhkan proses inisialisasi ketika suatu object dibuat. Suatu constructor juga bisa memiliki satu atau beberapa parameter, sama seperti method pada umumnya namun constructor tidak bisa mengembalikan value.
Object
Object merupakan produk hasil dari suatu class. Jika class merupakan blueprint dari suatu rancangan bangunan, maka object adalah bangunan itu sendiri. Begitulah contoh analogi yang bisa saya gambarkan mengenai relasi antara class dan object. Berikut contoh implementasi dalam bentuk code program:
class Car:
color = 'black'
transmission = 'manual'
gear_position = 'N'
def __init__(self, transmission):
self.transmission = transmission
print('Engine is ready!')
def drive(self):
self.gear_position = 'D'
print('Drive')
def reverse(self):
self.gear_position = 'N'
print('Reverse. Please check your behind.')
def change_gear(self, gear='N'):
self.gear_position = gear
print('Gear position on: ' + self.gear_position)
def get_gear_position(self):
return self.gear_position
car1 = Car('manual')
car1.change_gear('D-1')
car2 = Car('automatic')
gear_position = car2.get_gear_position()
print(gear_position)
>>> 'N'
Dari contoh di atas, terdapat 2 buah object car1
dan car2
yang dibuat dari class yang sama. Masing-masing dari object tersebut berdiri sendiri, artinya jika terjadi perubahan attribute dari object car1
tidak akan mempengaruhi object car2
meskipun dari class yang sama.
Inheritance
Salah satu keuntungan dari konsep OOP ialah reusable codes yang bisa mengoptimalkan penggunaan code program agar lebih efisien dan meminimalisir redudansi. Semua itu berkat adanya fitur inheritance yang memungkinkan suatu class (parent) menurunkan semua attribute dan behaviour nya ke class (child) lain. Berikut contoh penerapannya:
class Tesla(Car):
pass # use 'pass' keyword to define class only
tesla = Tesla()
tesla.drive()
>>> 'Drive'
Pada potongan code di atas, class Tesla
merupakan turunan dari class Car
. Jika diperhatikan pada class Tesla
tidak didefinisikan method drive()
namun class tersebut bisa memanggil method drive()
. Method tersebut berasal dari class parentnya yaitu class Car
, sehingga tidak perlu lagi didefinisikan ulang pada class childnya. Dengan cara seperti ini anda bisa melakukan reusable codes sehingga source code menjadi lebih clean.
Overriding
Ada suatu kondisi dimana suatu method yang berasal dari parent ingin anda modifikasi atau ditambahkan beberapa fitur sesuai kebutuhan pada class child, disinilah peran dari 'overriding method'. Dengan menggunakan fungsi super()
, anda bisa memanggil instance dari class parent di dalam suatu method untuk memanggil fungsi dari parent tersebut. Perhatikan contoh di bawah ini:
class Tesla(Car):
def drive(self):
super().drive()
print('LOL Gas')
Private Attribute/Function
Tidak semua attribute maupun method bisa diturunkan pada class child. Anda bisa menentukan mana attribute atau method yang ingin diproteksi agar tidak bisa digunakan pada class turunannya. Berikut caranya:
__factory_number = '0123456789'
def __get_factory_number(self):
return self.__factory_number
Polimorphism
Terakhir dari konsep OOP adalah polimorfisme yang memungkinkan anda untuk membuat banyak bentuk dari satu object. Berikut contoh implementasinya:
class Car:
def fuel(self):
return 'gas'
class Honda(Car):
pass
class Tesla(Car):
def fuel(self):
return 'electricity'
def get_fuel(car):
print(car.fuel())
get_fuel(Tesla())
get_fuel(Honda())
>>> 'electricity'
>>> 'gas