Pemrograman Berorientasi Objek di Python

14 views

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 jadwal dimodelkan menyerupai objek dalam dunia nyata. Objek di dunia konkret mempunyai ciri atau attribut dan juga agresi atau kelakuan (behaviour).

Kita misalkan sebuah mobil. Mobil mempunyai 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 agresi atau sesuatu yang sanggup dilakukan olehnya. Misalnya, ketika pedal diinjak apa yang terjadi. Ketika di rem apa yang terjadi, dan lain sebagainya.

Program juga demikian. Semua unit dalam jadwal sanggup 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 dibentuk sudah mengadopsi OOP. Selain itu Python juga sanggup memakai paradigma pemrograman usang yaitu pemrograman terstruktur. Oleh alasannya itu, Python disebut bersifat hibrid.


Istilah – Istilah Dalam OOP

Sebelum mempelajari lebih jauh perihal 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 bekerjasama dengan kelas dan objeknya
  • Overloading Fungsi – Overloading fungsi yaitu fungsi yang mempunyai nama yang sama di dalam kelas, tapi dengan jumlah dan tipe argumen yang berbeda sehingga sanggup melaksanakan beberapa hal yang berbeda.
  • Overloading operator – Overloading operator yaitu pembuatan beberapa fungsi atau kegunaan untuk suatu operator. Misalnya operator + dibentuk 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 dibentuk dari prototipe kelas Lingkaran contohnya 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 memakai kata kunci class diikuti oleh nama kelas tersebut. Berikut yaitu sintaks pembuatan kelas di Python.

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

Kelas mempunyai docstring atau string dokumentasi yang bersifat opsional artinya sanggup ada atau tidak. Docstring sanggup diakses memakai 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 sanggup diakses dari dalam atau luar kelas dengan memakai notasi titik, Karyawan.jumlah_karyawan.

Metode __init__() yaitu metode konstruktor, yaitu metode khusus yang dipakai 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 berjulukan self. Pada ketika pemanggilan fungsi, argumen ini otomatis ditambahkan oleh Python. Anda tidak perlu menambahkannya pada ketika memanggil fungsi.


Instansiasi Objek

Untuk menciptakan objek dari sebuah kelas, kita sanggup memanggil nama kelas dengan argumen sesuai dengan fungsi __init__() pada ketika 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 sanggup mengakses atribut objek dengan memakai operator titik. Variabel kelas sanggup diakses dengan memakai 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 ketika jadwal di atas dijalankan, outputnya yaitu menyerupai berikut:

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


Menambah, Menghapus, dan Mengubah Atribut Objek

Kita sanggup menambah, menghapus, dan mengubah atribut objek menyerupai berikut:

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

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

  • getattr(obj, name[, default]) – Mengakses atribut objek
  • hasattr(obj, name) – Memeriksa apakah objek mempunyai 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 mempunyai atribut built-in (bawaan) yang sanggup diakses memakai 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 daerah 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 jadwal 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 ketika jadwal dihukum dan dipicu pada ketika tidak ada lagi referensi/variabel yang merujuk ke objek.

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

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

a = 30    # Menciptakan 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 sudah tidak ada variabel yang merujuk ke objek tersebut.

Python melaksanakan abolisi objek secara otomatis tanpa ada pemberitahuan. Kita sanggup memakai 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 aba-aba di atas yaitu menyerupai berikut:

140154852984592 140154852984592 140154852984592
Point dihancurkan


Pewarisan (Inheritansi) Kelas

Kita sanggup menurunkan karakteristik sebuah kelas ke kelas baru, dibandingkan dengan menciptakan 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 sanggup memakai atribut tersebut seolah atribut itu didefinisikan juga di dalam kelas anak. Kelas anak juga sanggup menimpa (override) data dan metode dari induknya dengan data dan metodenya sendiri.

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

Sintaks

Pewarisan mempunyai 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 aba-aba di atas yaitu menyerupai berikut:

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

Dengan cara yang sama, kita sanggup menciptakan mewariskan beberapa induk ke satu anak menyerupai berikut:

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

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

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

Kita sanggup memakai 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 sanggup mengabaikan fungsi dari kelas induk di dalam kelas anak. Alasan untuk melaksanakan overriding yaitu alasannya 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 aba-aba 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 menawarkan beberapa fungsi umum yang sering di-override di dalam kelas:

No Metode, 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 sanggup dievaluasi

Contoh pemanggilan: repr(obj)

4 __str__(self)

Fungsi: Representasi string yang sanggup dicetak

Contoh pemanggilan: str(obj)

5 __cmp__(self, x)

Fungsi: Membandingkan objek

Contoh pemanggilan: cmp(obj, x)


Overloading Operator

Misalkan kita menciptakan sebuah kelas Vector untuk menawarkan vektor dua dimensi. Apa yang terjadi bila kita memakai tanda + untuk menjumlahkan keduanya?

Kita sanggup mendefinisikan metode __add__ dalam kelas kita untuk melaksanakan penjumlahan vektor dan lalu 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 jadwal di atas dieksekusi, hasilnya akan muncul menyerupai berikut:

Vector(9, 8)


Menyembunyikan Data (Data Hiding)

Sebuah atribut objek sanggup dibentuk 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 sanggup 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 aba-aba di atas dijalankan maka keluarannya akan menampilkan hasil menyerupai 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 sanggup mengakses atribut menyerupai itu dengan format object._className__attrName menyerupai berikut:

print(counter._Counter__secret_count)

Output dari jadwal di atas yaitu menyerupai berikut:

1
2
3

Author: 
    author
    No related post!