Pada program yang selama ini kita buat, kita mendesain program kita berdasarkan fungsi (blok statemen yang memanipulasi data). Hal ini disebut pemrograman procedure-oriented.
Ada cara lain untuk mengorganisasi program dengan menggabungkan data dan operasi yang dibungkus dalam suatu obyek yaitu paradigma pemrograman berorientasi obyek.
Obyek memiliki field berupa variabel obyek dan method berupa fungsi obyek. Keduanya disebut atribut obyek. Class juga dapat memiliki field class (variabel class) dan method class. Class didefinisikan dengan keyword class.
Dalam deklarasi method pada class terdapat perbedaan yaitu ada parameter pertama yang harus ditambahkan pada parameter fungsi. Parameter ini diberi nama self, nilai dari parameter ini menunjuk ke obyek / instance itu sendiri.
Catatan
programmer Java, C# dan C++ terbiasa dengan keyword this. Bedanya untuk Python variabel ini dikirim ke method secara eksplisit.
Nilai self ini disediakan oleh Python. Contoh, ada class ClassSaya yang mempunyai instance obyek obyeksaya. Ketika method dipanggil pada obyek obyeksaya.method(arg1, arg2), secara otomatis diubah oleh Python menjadi ClassSaya.method(obyeksaya, arg1, arg2).
Berikut contoh class yang sederhana.
# lat31.py
class Orang:
pass
org = Orang()
print(org)
jika dijalankan akan mengeluarkan
<__main__.Orang instance at 0x7f67decc9bd8>
Menunjukkan variabel org adalah instance class Orang pada alamat memory 0x7f67decc9bd8.
Berikut contoh deklarasi method pada class.
# lat32.py
class Orang:
def katakanHalo(self):
print 'Halo, apa kabar?'
org = Orang()
org.katakanHalo()
Catatan
Perhatikan walaupun method katakanHalo tidak membaca parameter, masih ada self pada deklarasi method.
Ada nama-nama method spesial pada class Python. __init__ adalah salah satunya, method ini akan dijalankan ketika obyek dibuat. Method ini berguna untuk melakukan inisialisasi. Perhatikan garis bawah dua kali di awal dan di akhir method (double underscore, dunder).
# lat33.py
class Orang:
def __init__(self, nama):
self.nama = nama
def katakanHalo(self):
print 'Halo, nama saya %s, apa kabar?' % self.nama
org = Orang('budi')
org.katakanHalo()
Variabel Class yaitu variabel yang dimiliki oleh class, sedangkan variabel obyek adalah variabel yang yang dimiliki oleh tiap-tiap obyek instance dari class.
# lat34.py
class Orang:
# variabel class, untuk menghitung jumlah orang
total = 0
def __init__(self, nama):
# inisiasi data, data yang dibuat pada self merupakan variabel obyek
self.nama = nama
# ketika ada orang yang dibuat, tambahkan total orang
Orang.total += 1
def __del__(self):
# kurangi total orang jika obyek dihapus
Orang.total -= 1
def katakanHalo(self):
print 'Halo, nama saya %s, apa kabar?' % self.nama
def total_populasi(cls):
print 'Total Orang %s' % cls.total
# method class
total_populasi = classmethod(total_populasi)
org = Orang('budi')
org.katakanHalo()
Orang.total_populasi()
org2 = Orang('andi')
org2.katakanHalo()
Orang.total_populasi()
print 'obyek dihapus'
del org
del org2
Orang.total_populasi()
Salah satu keuntungan dari OOP adalan penggunaan ulang kode dan salah satu caranya yaitu menggunakan mekanisme inheritance / turunan.
# lat35.py
# base class / superclass
class AnggotaSekolah:
"representasi anggota sekolah"
def __init__(self, nama, umur):
self.nama = nama
self.umur = umur
print 'membuat anggota sekolah baru: %s' % self.nama
def info(self):
"cetak info"
print 'Nama: %s, Umur: %s' % (self.nama, self.umur)
# subclass
class Guru(AnggotaSekolah):
"representasi guru"
def __init__(self, nama, umur, gaji):
AnggotaSekolah.__init__(self, nama, umur)
self.gaji = gaji
print 'membuat guru: %s' % self.nama
def info(self):
AnggotaSekolah.info(self)
print 'Gaji: %s' % self.gaji
# subclass
class Siswa(AnggotaSekolah):
"representasi siswa"
def __init__(self, nama, umur, nilai):
AnggotaSekolah.__init__(self, nama, umur)
self.nilai = nilai
print 'membuat siswa: %s' % self.nama
def info(self):
AnggotaSekolah.info(self)
print 'Nilai: %s' % self.nilai
guru = Guru('Budi', 40, 3000000)
siswa = Siswa('Andi', 25, 75)
# cetak baris kosong
print
anggota = [guru, siswa]
for orang in anggota:
orang.info()