Pemrograman Berorientasi Objek Di Python

Pengertian Pemrograman Berorientasi Objek



Pemrograman berorientasi objek atau dalam bahasa inggris disebut Object Oriented Programming (OOP) yaitu paradigma atau teknik pemrograman di mana semua hal dalam kegiatan dimodelkan mirip objek dalam dunia nyata. Objek di dunia nyata memiliki ciri atau attribut dan juga aksi atau kelakuan (behaviour).





Kita misalkan sebuah mobil. Mobil memiliki ciri punya ban, stang, kursi, pedal gas, rem, dan lain sebagainya. Ada juga ciri warna, atau tahun keluaran berapa. Selain punya ciri, kendaraan beroda empat juga punya aksi atau sesuatu yang mampu dilakukan olehnya. Misalnya, saat pedal diinjak apa yang terjadi. Ketika di rem apa yang terjadi, dan lain sebagainya.



Program juga demikian. Semua unit dalam kegiatan mampu dianggap sebagai objek. Objek besar dibangun dari objek – objek yang lebih kecil. Objek yang satu berinteraksi dengan objek yang lain, sehingga semua menjadi sebuah kesatuan yang utuh.



Python dari awal dibuat sudah mengadopsi OOP. Selain itu Python juga mampu menggunakan paradigma pemrograman lama yaitu pemrograman terstruktur. Oleh alasannya ialah itu, Python disebut bersifat hibrid.





Istilah – Istilah Dalam OOP



Sebelum mempelajari lebih jauh wacana OOP, ada baiknya kita harus mengetahui istilah – istilah dalam OOP, yaitu sebagai berikut:




  • Kelas – Kelas yaitu cetak biru atau prototipe dari objek dimana kita mendefinisikan atribut dari suatu objek. Atribut ini terdiri dari data member (variabel) dan fungsi (metode).


  • Variabel Kelas – Variabel kelas yaitu variabel yang dishare atau dibagi oleh semua instance (turunan) dari kelas. Variabel kelas didefinisikan di dalam kelas, tapi di luar metode-metode yang ada dalam kelas tersebut.


  • Data member – Data member yaitu variabel yang menyimpan data yang berhubungan dengan kelas dan objeknya


  • Overloading Fungsi – Overloading fungsi yaitu fungsi yang memiliki nama yang sama di dalam kelas, tapi dengan jumlah dan tipe argumen yang berbeda sehingga mampu melakukan beberapa hal yang berbeda.


  • Overloading operator – Overloading operator yaitu pembuatan beberapa fungsi atau kegunaan untuk suatu operator. Misalnya operator + dibuat tidak hanya untuk penjumlahan, tapi juga untuk fungsi lain.


  • Variabel instansiasi – Variabel instansiasi yaitu variabel yang didefinisikan di dalam suatu metode dan hanya menjadi milik dari instance kelas.


  • Pewarisan/Inheritansi – Inheritansi yaitu pewarisan karakteristik sebuah kelas ke kelas lain yang menjadi turunannya.


  • InstanceInstance yaitu istilah lain dari objek suatu kelas. Sebuah objek yang dibuat dari prototipe kelas Lingkaran misalnya disebut sebagai instance dari kelas tersebut.


  • Instansiasi – Instansiasi yaitu pembuatan instance/objek dari suatu kelas


  • Metode – Metode yaitu fungsi yang didefinisikan di dalam suatu kelas


  • Objek – Objek yaitu instansiasi atau perwujudan dari sebuah kelas. Bila kelas yaitu prototipenya, dan objek yaitu barang jadinya.





Pembuatan Kelas



Kita mendefinisikan sebuah kelas dengan menggunakan kata kunci class diikuti oleh nama kelas tersebut. Berikut yaitu sintaks pembuatan kelas di Python.



class ClassName:
'''class docstring'''
class_body


Kelas memiliki docstring atau string dokumentasi yang bersifat opsional artinya mampu ada atau tidak. Docstring mampu diakses menggunakan format ClassName.__doc__



class_body terdiri dari semua pernyataan berupa attribut, fungsi, dan data dari kelas





Contoh Kelas




Berikut yaitu pola kelas yang sederhana:



class Karyawan:
'''Dasar kelas untuk semua karyawan'''
jumlah_karyawan = 0

def __init__(self, nama, gaji):
self.nama = nama
self.gaji = gaji
Karyawan.jumlah_karyawan += 1

def tampilkan_jumlah(self):
print("Total karyawan:", Karyawan.jumlah_karyawan)

def tampilkan_profil(self):
print("Nama :", self.nama)
print("Gaji :", self.gaji)
print()


Variabel jumlah_karyawan yaitu variabel kelas yang dibagi ke semua instance/objek dari kelas ini. Variabel ini mampu diakses dari dalam atau luar kelas dengan menggunakan notasi titik, Karyawan.jumlah_karyawan.



Metode __init__() yaitu metode konstruktor, yaitu metode khusus yang digunakan Python untuk menginisialisasi pembuatan objek dari kelas tersebut.



Fungsi – fungsi di dalam kelas (disebut metode) pendefinisiannya sama dengan fungsi pada umumnya. Hanya saja, harus ada argumen pertama bernama self. Pada saat pemanggilan fungsi, argumen ini otomatis ditambahkan oleh Python. Anda tidak perlu menambahkannya pada saat memanggil fungsi.





Instansiasi Objek



Untuk membuat objek dari sebuah kelas, kita mampu memanggil nama kelas dengan argumen sesuai dengan fungsi __init__() pada saat kita mendefinisikannya.



# Membuat objek pertama dari kelas Karyawan
karyawan1 = Karyawan("Sarah", 1000000)

# Membuat objek kedua dari kelas Karyawan
karyawan2 = Karyawan("Budi", 2000000)




Mengakses Attribut Objek



Kita mampu mengakses atribut objek dengan menggunakan operator titik. Variabel kelas mampu diakses dengan menggunakan nama kelasnya.



karyawan1.tampilkan_profil()
karyawan2.tampilkan_profil()
print("Total karyawan :", Karyawan.jumlah_karyawan)


Sekarang, mari kita gabungkan semua pola di atas.




class Karyawan:
'''Dasar kelas untuk semua karyawan'''
jumlah_karyawan = 0


def __init__(self, nama, gaji):
self.nama = nama
self.gaji = gaji
Karyawan.jumlah_karyawan += 1


def tampilkan_jumlah(self):
print("Total karyawan:", Karyawan.jumlah_karyawan)


def tampilkan_profil(self):
print("Nama :", self.nama)
print("Gaji :", self.gaji)


# Membuat objek pertama dari kelas Karyawan
karyawan1 = Karyawan("Sarah", 1000000)
# Membuat objek kedua dari kelas Karyawan
karyawan2 = Karyawan("Budi", 2000000)


karyawan1.tampilkan_profil()
karyawan2.tampilkan_profil()
print("Total karyawan :", Karyawan.jumlah_karyawan)


Pada saat kegiatan di atas dijalankan, outputnya yaitu mirip berikut:



Nama : Sarah
Gaji : 1000000
Nama : Budi
Gaji : 2000000
Total karyawan : 2




Menambah, Menghapus, dan Mengubah Atribut Objek



Kita mampu menambah, menghapus, dan mengubah atribut objek mirip berikut:



karyawan1.gaji = 1500000
karyawan1.nama = 'Ratna'
del karyawan1.gaji


Cara yang lebih elegan untuk memodifikasi atribut yaitu dengan menggunakan fungsi – fungsi berikut:




  • getattr(obj, name[, default]) – Mengakses atribut objek


  • hasattr(obj, name) – Memeriksa apakah objek memiliki atribut tertentu atau tidak


  • setattr(obj, name, value) – Mengatur nilai atribut. Jika atribut tidak ada, maka atribut tersebut akan dibuatkan


  • delattr(obj, name) – Menghapus atribut dari objek



hasattr(karyawan1, 'gaji')    # True jikalau atribut 'gaji' ada
getattr(karyawan1, 'gaji') # mengembalikan nilai dari attribut 'gaji'
setattr(karyawan1, 'gaji', 1600000) # mengatur nilai atribut 'gaji'
delattr(karyawan1, 'gaji') # menghapus atribut 'gaji'




Atribut Kelas Built-in



Setiap kelas di Python memiliki atribut built-in (bawaan) yang mampu diakses menggunakan operator titik. Attribut-attribut tersebut yaitu sebagai berikut:




  • __dict__ – dictionary yang berisi namespace dari kelas


  • __doc__ – mengakses string dokumentasi (docstring) dari kelas


  • __name__ – nama kelas


  • __module__ – nama modul kawasan kelas didefinisikan. Nilai attribut ini di mode interaktif yaitu “__main__“.


  • __bases__ – dasar dari kelas, bila kelas tidak merupakan turunan dari kelas lain, maka induknya dalah kelas object.




class Karyawan:
'''Dasar kelas untuk semua karyawan'''
jumlah_karyawan = 0


def __init__(self, nama, gaji):
self.nama = nama
self.gaji = gaji
Karyawan.jumlah_karyawan += 1


def tampilkan_jumlah(self):
print("Total karyawan:", Karyawan.jumlah_karyawan)


def tampilkan_profil(self):
print("Nama :", self.nama)
print("Gaji :", self.gaji)


# Membuat objek pertama dari kelas Karyawan
karyawan1 = Karyawan("Sarah", 1000000)
# Membuat objek kedua dari kelas Karyawan
karyawan2 = Karyawan("Budi", 2000000)


print("Karyawan.__doc__:", Karyawan.__doc__)
print("Karyawan.__name__:", Karyawan.__name__)
print("Karyawan.__module__:", Karyawan.__module__)
print("Karyawan.__dict__:", Karyawan.__dict__)
print("Karyawan.__bases__:", Karyawan.__bases__)


Output dari kegiatan di atas adalah:



Karyawan.__doc__: Dasar kelas untuk semua karyawan
Karyawan.__name__: Karyawan
Karyawan.__module__: __main__
Karyawan.__dict__: {'tampilkan_jumlah': , '__module__': '__main__', '__doc__': 'Dasar kelas untuk semua karyawan', 'jumlah_karyawan': 2, '__weakref__': <attribute '__weakref__' of 'Karyawan' objects>, 'tampilkan_profil': , '__dict__': <attribute '__dict__' of 'Karyawan' objects>, '__init__': }
Karyawan.__bases__: (<class 'object'>,)




Penghancuran Objek (Pengumpulan Sampah/Garbage Collection)



Python menghapus objek yang sudah tidak terpakai secara otomatis untuk menghemat memori. Proses ini disebut dengan pengumpulan sampah (garbage collection).



Kolektor sampah Python terus berjalan pada saat kegiatan dieksekusi dan dipicu pada saat tidak ada lagi referensi/variabel yang merujuk ke objek.



Jumlah rujukan terhadap objek bertambah pada saat ada variabel yang merujuk ke objek tersebut. Sebaliknya rujukan terhadap objek berkurang saat variabel terhapus dengan menggunakan del, atau saat terjadi penugasan ulang, atau saat rujukan keluar dari scope-nya.



Pada saat rujukan terhadap objek sudah nol, maka Python akan otomatis menghapus objek tersebut. Perhatikan pola berikut:



a = 30    # Membuat objek <30>
b = a # menambah jumlah rujukan ke objek <30>
c = [b] # menambah jumlah rujukan ke objek <30>

del a # mengurangi jumlah rujukan ke objek <30>
b = 100 # mengurangi jumlah rujukan ke objek <30>
c[0] = -1 # mengurangi jumlah rujukan ke objek <30>


Pada pola di atas, objek 30 pada kesannya akan dihapus alasannya ialah sudah tidak ada variabel yang merujuk ke objek tersebut.



Python melakukan pembatalan objek secara otomatis tanpa ada pemberitahuan. Kita mampu menggunakan sebuah metode khusus yaitu metode __del__() yang disebut destruktor, yang akan dipanggil apabila sebuah objek akan dihapuskan oleh python.



Berikut yaitu pola penggunaan destruktor __del__().




class Point:
def __init__( self, x=0, y=0):
self.x = x
self.y = y


def __del__(self):
class_name = self.__class__.__name__
print (class_name, "dihancurkan")


pt1 = Point()
pt2 = pt1
pt3 = pt1
print (id(pt1), id(pt2), id(pt3)); # ,menampilkan id objek
del pt1
del pt2
del pt3


Output dari instruksi di atas yaitu mirip berikut:



140154852984592 140154852984592 140154852984592
Point dihancurkan




Pewarisan (Inheritansi) Kelas



Kita mampu menurunkan karakteristik sebuah kelas ke kelas baru, dibandingkan dengan membuat kelas gres dari awal. Turunannya disebut kelas anak (child class) dan yang mewariskannya disebut kelas induk (parent class).



Kelas anak mewarisi atribut dari kelas induk, dan kita mampu menggunakan atribut tersebut seolah atribut itu didefinisikan juga di dalam kelas anak. Kelas anak juga mampu menimpa (override) data dan metode dari induknya dengan data dan metodenya sendiri.



Satu kelas anak mampu mewarisi karakteristik dari satu atau beberapa kelas induk.



Sintaks



Pewarisan memiliki sintaks sebagai berikut:



class SubClassName (ParentClass1[, ParentClass2, ...]):
"""docstring"""
class_body


Contoh




class Induk: # mendefinisikan kelas Induk
parent_attr = 100


def __init__(self):
print ("Memanggil konstruktor induk")


def parent_method(self):
print ('Memanggil metode induk')


def set_attr(self, attr):
Induk.parent_attr = attr


def get_attr(self):
print ("Attribut induk :", Induk.parent_attr)


class Anak(Induk): # mendefinisikan kelas Anak
def __init__(self):
print ("Memanggil konstruktor Anak")


def child_method(self):
print ('Memanggil metode Anak')


c = Anak() # instansiasi kelas Anak
c.child_method() # Anak memanggil metodenya


c.parent_method() # memanggil metode Induk
c.set_attr(200) # kembali memanggil metode Induk
c.get_attr() # kembali memanggil metode Induk


Output dari instruksi di atas yaitu mirip berikut:



Memanggil konstruktor Anak
Memanggil metode Anak
Memanggil metode induk
Attribut induk: 200


Dengan cara yang sama, kita mampu membuat mewariskan beberapa induk ke satu anak mirip berikut:



class A:      # mendefinisikan kelas A
.....

class B: # mendefinisikan kelas B
.....

class C(A, B): # mendefinisikan turunan dari kelas A dan B
.....


Kita mampu menggunakan fungsi issubclass() atau isinstance() untuk menyelidiki kekerabatan antara dua kelas atau objek.




  • Fungsi issubclass(sub, sup) mengembalikan True jikalau sub merupakan anak dari sup


  • Fungsi isinstance(obj, Class) mengembalikan True jikalau obj yaitu instance dari kelas Class atau subkelas dari Class.





Metode Overriding



Kita mampu mengabaikan fungsi dari kelas induk di dalam kelas anak. Alasan untuk melakukan overriding yaitu alasannya ialah kita memodifikasi atau mengubah metode yang sudah diturunkan dari kelas induk di dalam kelas anak. Perhatikan pola berikut:




class Induk:
def my_method(self):
print("Memanggil metode induk")


class Anak(Induk):
def my_method(self):
print("Memanggil metode anak")


c = Anak()
c.my_method()


Hasil keluaran dari instruksi di atas adalah:



Memanggil metode anak


Perhatikan pada pola di atas bagaimana kita mengabaikan metode yang dari induk dan mendefinisikan sendiri metode dengan nama yang sama di kelas anak. Dan yang dijalankan yaitu metode yang ada di kelas anak.





Overloading Metode



Tabel berikut memperlihatkan beberapa fungsi umum yang sering di-override di dalam kelas:









































NoMetode, Deskripsi, dan Contoh
1__init__(self[, args…])


Fungsi: Konstruktor (argumen bersifat opsional)


Contoh pemanggilan: obj = className(args)

2__del__(self)


Fungsi: Destruktor, menghapus sebuah objek


Contoh pemanggilan: del obj

3__repr__(self)


Fungsi: Representasi string yang mampu dievaluasi


Contoh pemanggilan: repr(obj)

4__str__(self)


Fungsi: Representasi string yang mampu dicetak


Contoh pemanggilan: str(obj)

5__cmp__(self, x)


Fungsi: Membandingkan objek


Contoh pemanggilan: cmp(obj, x)





Overloading Operator



Misalkan kita membuat sebuah kelas Vector untuk memperlihatkan vektor dua dimensi. Apa yang terjadi bila kita menggunakan tanda + untuk menjumlahkan keduanya?



Kita mampu mendefinisikan metode __add__ dalam kelas kita untuk melakukan penjumlahan vektor dan kemudian operator + akan berfungsi sesuai kehendak kita. Perhatikan pola berikut:




class Vector:
def __init__(self, a, b):
self.a = a
self.b = b


def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)


def __add__(self, other):
return Vector(self.a + other.a, self.b + other.b)


v1 = Vector(5, 10)
v2 = Vector(4, -2)


print(v1 + v2)


Saat kegiatan di atas dieksekusi, karenanya akan muncul mirip berikut:



Vector(9, 8)




Menyembunyikan Data (Data Hiding)



Sebuah atribut objek mampu dibuat terlihat ataupun tersembunyi dari luar kelas. Caranya di Python yaitu dengan memberi nama atribut dengan di awali tanda underscore dua kali. Dengan begitu, atribut tersebut tidak akan mampu tampak dari luar kelas.





Contoh



class Counter:
__secret_count = 0

def count(self):
self.__secret_count += 1
print(self.__secret_count)

counter = Counter()
counter.count()
counter.count()
print(counter.__secret_count)


Bila instruksi di atas dijalankan maka keluarannya akan menampilkan hasil mirip berikut:



1
2
Traceback(most recent call last):
File "test.py", line 12, in <module>
Attribut Error: Counter instance has no attribute '__secret_count'


Python melindungi attribut tersebut dengan mengubah namanya. Kita mampu mengakses atribut mirip itu dengan format object._className__attrName mirip berikut:



print(counter._Counter__secret_count)


Output dari kegiatan di atas yaitu mirip berikut:



1
2
3


Popular posts from this blog

Subitems Listview Berwarna Selang Seling

Source Code Aplikasi Tagihan Internet Memakai Php