Daftar Isi

Topik sebelum

Struktur Data

Topik berikutnya

Input dan Output

Halaman Ini

Object-Oriented Programming (Pemrograman berorientasi Obyek)

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.

this -> self

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).

Class

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.

Method Obyek

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.

Method init

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 dan Variabel Obyek (Instance)

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()

Inheritance

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()