akan dibentuk kedalam sebuah variabel. Kemudian di bagian try-except tersebut kita coba akses
atribut tinggi. Karena atribut tersebut tidak ada di kelas persegi panjang, maka exception
AttributeError akan muncul.
<< gambar 8.3 hasil eksekusi exception_3.py >>
Contoh yang terakhir dari sekian banyak exception yang terdapat di Python adalah IOError.
Exception ini biasa terjadi ketika proses input data, saat mencetak data, atau saat operasi file. Pada
contoh berikut kita akan membuka sebuah file, tapi file tersebut tidak ada. Secara default jika kita
membuka file tanpa menyertakan mode pembacaan, maka mode tersebut adalah mode 'r' yang
artinya read atau baca.
listing : exception_4.py
try :
f = open('nilai.txt')
except IOError, e:
print "Proses pembukaan file gagal karena : ", e
print "proses cetak pada baris ini masih dapat dijalankan"
Pada contoh diatas kita ingin file nilai.txt, tapi karena file tersebut belum pernah ditulis sebelumnya
maka exception akan muncul yaitu IOError. Selain digunakan untuk file, IOError dapat terjadi juga
saat pembacaan built-in storage milik Python seperti saat pembacaan pickle, shelve, dan marshal.
69
<< gambar 8.4 hasil eksekusi exception_4.py >>
Menyusun Multiple Except
Apakah kita dapat menangkap exception dalam satu blok try-except ?. Di Python sendiri terdapat
fitur multiple except, yaitu kita dapat menangkap exception dengan baris except yang berbeda. Hal
ini dilakukan jika kita ingin memberikan perlakuan berbeda kepada setiap exception yang ditangani.
Lebih lemgkapnya pantau kode dibawah ini.
listing : exception_5.py
try:
angka1 = int(raw_input('masukkan angka ke-1 : '))
angka2 = int(raw_input('masukkan angka ke-2 : '))
print 'hasil perhitungan : ', angka1 / angka2
except ZeroDivisionError, e:
print "proses pembagian gagal karena : ", e
except ValueError, e:
print "proses perhitungan gagal karena : ", e
print "proses cetak ini masih dapat dijalankan "
Pada kode diatas kita mencoba menjebak dua buah exception dengan dua baris except berbeda. Hal
tersebut dilakukan agar perlakuan pada penanganan setiap exception memiliki penanganan yang
berbeda. Misal pada baris except pembagian nol ada informasi “proses pembagian gagal karena : “ ,
sedangkan di baris except nilai error terdapat informasi “proses perhitungan gagal karena : “. Jadi
dengan memakai baris except yang berbeda Anda dapat menangani error yang berbeda sesuai
kebutuhan Anda.
70
<< gambar 8.5 hasil eksekusi exception_5.py >>
memakai Multiple Exception
Berbeda sedikit pada contoh sebelumnya, jika pada setiap exception ditangani oleh setiap baris
except. Maka pada kaidah multiple exception di satu except menangani beberapa exception.
Bedanya, semua exception yang ditangani baris except tersebut akan mendapat penanganan yang
sama.
listing : exception_6.py
try:
angka1 = float(raw_input('masukkan angka ke-1 : '))
angka2 = float(raw_input('masukkan angka ke-2 : '))
print 'hasil perhitungan : ', angka1 / angka2
except (ZeroDivisionError, ValueError, TypeError), e:
print "proses perhitungan gagal karena : ", e
print "proses cetak ini masih dapat dijalankan "
Kode diatas jika dieksekusi akan muncul tampilan seperti berikut :
71
<< gambar 8.6 hasil eksekusi exception_6.py >>
Try-Except Bersarang
Mirip seperti kondisional atau perulangan yang dapat ditambahkan blok kode kondisional atau
perulangan didalamnya. Try-except pun mempunyai kaidah yang sama dimana try-except dapat
disimpan didalam try-except yang lainnya. Prioritasnya adalah tangani yang luar terlebih dahulu.
Jika terjadi di try-except terluar maka blok kode didalamnya yang terdapat try-except tidak akan
dieksekusi. Jika di blok luar tidak terdapat error. Maka penanganan exception di try-except bagian
dalam akan dilakukan.
listing : exception_7.py
try:
angka1 = float(raw_input('masukkan angka ke-1 : '))
angka2 = float(raw_input('masukkan angka ke-2 : '))
try :
print 'hasil perhitungan : ', angka1 / angka2
except ZeroDivisionError, e:
print "proses perhitungan gagal karena : ", e
except ValueError, e:
print "proses input gagal karena : ", e
print "proses cetak ini masih dapat dijalankan "
Jika pada contoh exception_5.py baris except ZeroDivisionError disimpan di tingkat pertama,
sekarang baris tersebut disarangkan di try-except yang utama. Dengan demikian Anda dapat
menangani exception dari dalam secara langsung.
72
<< gambar 8.7 hasil eksekusi exception_7.py >>
Membuat Exception Sendiri
Lalu apakah kita terbatas pada penanganan standard exception Python saja ?. Anda dapat membuat
exception Anda sendiri dengan membuat sebuah kelas yang diturunkan dari kelas Exception.
Dengan cara tersebut, Anda dapat membuat exception Anda sesuai kebutuhan pada kasus yang akan
Anda tangani. Misal kita ingin membuat sebuah exception jika angka yang dimasukkan adalah
angka negatif. Pertama kita buat dulu class nya dengan nama yang diingikan, turunkan dari kelas
Exception, dan tentukan penanganan error pada method – method di kelas tersebut.
listing : exception_8.py
class NegativeValueError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
s = "Tidak menerima angka kurang dari 0 " + str(self.value)
return s
def cekAngka(angka):
if angka < 0:
raise NegativeValueError(angka)
try:
sebuah_angka = int(raw_input("masukkan sebuah angka : "))
cekAngka(sebuah_angka)
except (NegativeValueError, TypeError), e:
73
print "proses gagal karena : ", e
Untuk memanggil exception-nya kita memerlukan keyword raise ketika exception tersebut
dimunculkan maka exception akan ditangani except dan mengeluarkan pesan error-nya. Pesan
tersebut berasal dari function __str__() yang sebelumnya telah kita definisikan pada kelas
NegativeValueError.
<< gambar 8.8 hasil eksekusi exception_8.py >>
memakai “finally” pada Try-Except
Dan akhirnya sekarang kita membahas finally. Keyword ini digunakan untuk menentukan
penanganan apa yang harus dilakukan baik ketika exception muncul atau tidak. Misal saat
mengambil data dari database, kita tidak akan tahu ada kegagalan apa yang akan terjadi. Agar
program kita tetap aman dan data tidak rusak. Maka baik terjadi kegagalan atau tidak koneksi ke
database harus ditutup. Hal tersebut juga bisa terjadi saat pembacaan file. Untuk mencegah
kerusakan file, baik akan terjadi error atau tidak, file harus ditutup. Di blok finally ini penanganan
yang terjadi ketika exception muncul atau tidak disimpan.
listing : exception_9.py
try:
angka1 = float(raw_input('masukkan angka ke-1 : '))
angka2 = float(raw_input('masukkan angka ke-2 : '))
try :
print 'hasil perhitungan : ', angka1 / angka2
except ZeroDivisionError, e:
print "proses perhitungan gagal karena : ", e
except ValueError, e:
print "proses input gagal karena : ", e
finally:
74
print "coba perhatikan lagi nilai yang anda masukkan "
print "proses cetak ini masih dapat dijalankan "
Kode diatas jika dieksekusi akan muncul tampilan seperti berikut :
<< gambar 8.9 hasil eksekusi exception_9.py >>
9. Membuat File
Pengenalan File
Biasanya jika kita tidak memakai file, hasil pemrosesan data hanya akan disimpan di main
memory. Setelah program dihentikan atau tiba – tiba komputer Anda mati, semua data akan hilang.
Lalu bagaimana jika ingin memakai kembali data yang sudah diproses sebelumnya ?. Untuk
menyimpan data agar bisa diproses di kesempatan selanjutnya, misal komputer dimatikan kemudian
dinyalakan lagi hari esoknya. Kita butuh sebuah penyimpanan yang bersifat resident dan disimpan
di secondary storage seperti harddisk. Python sendiri menyediakan beberapa media penyimpanan
yang bisa digunakan oleh programmer Python, ada file, shelve, marshal, pickle, dan sqlite3.
Pada bab ini kita akan bahas mengenai file berupat txt. File di Python bisa berupa txt, csv, atau jenis
lainnya. Txt merupakan contoh file yang sering digunakan. File jenis ini berisi plain text. File jenis
ini menyimpan karakter ascii standard yang diterima dari user.
Pada pembuatan file terdapat beberapa mode dalam manipulasi file. Berikut daftar mode manipulasi
file tersebut :
No Mode Keterangan
1 r Membuka file dan hanya untuk pembacaan
saja. Pointer file akan ditempatkan di awal
file. Jika pada saat pembukaan file tidak
disertakan mode manipulasi file, maka mode
75
ini secara default dipakai untuk manipulasi
file
2 w
Membuka file dan hanya untuk penulisan
saja. Jika file yang dibuka sudah ada dan
memakai mode 'w', maka file tersebut
akan ditimpa. Jika file tidak ada maka akan
dibuatkan file baru.
3 a
Membuka file untuk penambahan isi file.
Pointer file disimpan di bagian akhir file jika
file tersebut ada. Jika file tidak ada maka akan
dibuatkan file baru.
4 b
Mode ini ditambahkan masing – masing pada
mode r, w,a menjadi rb, wb, ab. Dengan
menambahkan mode b pada setiap mode
manipulasi standar. Maka pemba file caan file
akan dilakukan dalam format biner
5 +
Mode ini ditambahkan kedalam mode r, w, a.
r+ : baca dan tulis
w+ : tulis dan baca
a+ : tambah dan baca
Membuat File Baru
Agar lebih paham kita akan mencoba membuat sebuah file txt. Pertama kita biasakan cegah error
dengan memakai try-except dan tangkap exception IOError, agar jika terjadi error kelak, kita
bisa menanganinya dengan lebih mudah. Kemudian di dalam blok try-except tersebut buat sebuah
objek file dengan memakai built-in function open(). Pada function tersebut terdapat dua
parameter yang biasa digunakan yaitu, nama file serta mode manipulasi file-nya. Karena kita ingin
membuat file baru, maka mode “w” digunakan pada kasus pertama berikut :
listing : file_1.py
try:
sebuah_file = open("absen.txt", 'w')
print "nama file yang tadi dibuat : ", sebuah_file.name
print "mode pembacaan file : ", sebuah_file.mode
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
sebuah_file.close()
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
except IOError, e:
print "proses gagal karena : ", e
Ketika kita sudah membuka sebuah file dan terbentuk objek file. Kita dapat mengakses method dan
76
atribut pada objek file tersebut. Atribut yang sering diakses untuk pemrosesan file antara lain :
name, mode, closed. Atribut name adalah nama file tersebut, mode adalah mode manipulasi file
tersebut, dan closed menyatakan apakah file tersebut sudah ditutup atau belum. Sedangkan method
yang diakses diatas adalah close(), yang digunakan untuk menutup file setelah penggunaan file
selesai. Dengan menutup file, penggunaan memori utama akan dihemat. Jika tidak pernah menutup
file dalam jumlah yang banyak bisa menyebabkan memory leak. Jadi berhati – hatilah :D.
<< gambar 9.1 hasil eksekusi file_1.py >>
Mengisi File
Pada contoh pertama, file yang kita buat masih kosong, belum berisi. Sesuai namanya kita sedang
membuat file bernama 'absen.txt', yang didalamnya akan terdapat daftar hadir perkuliahan. Dengan
memakai method write(), kita bisa menambahkan isi pada file 'absen.txt', dan yang akan kita
isikan adalah teks. Method ini memerlukan parameter sebuah string yang akan ditulis di lokasi
tertentu pada file berdasarkan posisi pointer file berada.
listing : file_2.py
try:
sebuah_file = open("absen.txt", 'w')
print "nama file yang tadi dibuat : ", sebuah_file.name
print "mode pembacaan file : ", sebuah_file.mode
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
sebuah_file.write('1. Jajang Surahman, Teknik Informatika, ITENAS\n')
sebuah_file.write('2. Angel Corine, Manajemen Informatika, UNIKOM\n')
sebuah_file.write('3. Samsul Basri, Ilmu Komputer, UPI\n')
sebuah_file.close()
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
77
except IOError, e:
print "proses gagal karena : ", e
Setelah kita menambahkan isi pada file teks yang kita buat, kita dapat membuka file yang telah
dibuat dengan teks editor dan dapat melihat isi dari file tersebut.
<< gambar 9.2 hasil eksekusi file_2.py >>
Membaca Isi File
Setelah mengisi file dengan method write(). Sekarang kita akan memakai method read() untuk
membaca file. Pastikan, file yang akan dibaca harus dalam mode 'r', jika tidak dalam mode tersebut,
misal dalam mode 'w', maka akan muncul error : ”OError: File not open for reading”. Kemudian
untuk mengetahui posisi pointer file berada, kita gunakan method tell().
listing : file_3.py
try:
sebuah_file = open("absen.txt", 'r')
print "nama file yang tadi dibuat : ", sebuah_file.name
print "mode pembacaan file : ", sebuah_file.mode
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
print "isi file : \n", sebuah_file.read()
print "posisi pointer pada file : ", sebuah_file.tell()
sebuah_file.close()
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
except IOError, e:
print "proses gagal karena : ", e
78
Dengan memakai method read(), kita dapat melihat isi dari file tersebut. Tapi method ini
membaca sekaligus isi file yang dibaca, tidak perbaris. Jika pembacaan dilakukan sekaligus, ruang
memori yang dibutuhkan jauh lebih besar daripada file yang dibaca perbaris. Kemudian dengan
adanya method tell(), kita bisa mengetahui posisi pointer file berada dimana, agar mempermudah
saat manipulasi file.
<< gambar 9.3 hasil eksekusi file_3.py >>
Membaca Isi File dengan Cara Baris Per Baris
Jika pada contoh sebelumnya pembacaan file dilakukan sekaligus, pada contoh kali ini pembacaan
file akan dilakukan baris perbaris. Pembacaan file teks dengan membaca perbaris ini bisa dilakukan
dengan memakai pengulangan for. File ini diperlakukan layaknya list yang digunakan di
pengulangan for. Disini file dianggap sebagai list yang berisi elemen string.
listing : file_4.py
try:
sebuah_file = open("absen.txt", 'r')
print "nama file yang tadi dibuat : ", sebuah_file.name
print "mode pembacaan file : ", sebuah_file.mode
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
print "isi file : \n"
for line in sebuah_file:
print line
79
print "posisi pointer pada file : ", sebuah_file.tell()
sebuah_file.close()
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
except IOError, e:
print "proses gagal karena : ", e
Hasil yang diperlihatkan hampir sama dengan contoh sebelumnya hanya saja teknik pembacaannya
sedikit berbeda. Jika file berukuran besar, akan lebih bijak jika kita membacanya perbaris agar
ruang memori yang digunakan tidak banyak terpakai.
<< gambar 9.4 hasil eksekusi file_4.py >>
Mengatur Posisi Pointer File
Suatu saat kita ingin mengisi file di lokasi tertentu di sebuah file. Biasanya kita menambahkan file
di bagian akhir file, atau membaca file selalu dibagian awal file. Ada saatnya kita ingin membaca di
posisi ke 15 dari awal file, atau posisi -15 karakter dari pointer file. Di objek file terdapat method
yang dinamakan seek(). Method tersebut memiliki dua buah paramater yaitu jarak yang diinginkan
dan patokan jarak tersebut. Jika parameter kedua diisi oleh angka 0, berarti patokan berada di awal
file. Jika parameter kedua diisi oleh angka 1, berarti patokan berada di tempat pointer file berada.
Jika parameter kedua diisi oleh angka 2, maka patokan berada di bagian akhir file. Jika parameter
pertama diisi angka positif maka penentuan jarak akan dihitung ke sebelah kanan, jika diisi angka
negatif maka penentuan jarak akan dihitung ke sebelah kiri.
listing : file_5.py
try:
sebuah_file = open("absen.txt", 'rb')
print "nama file yang tadi dibuat : ", sebuah_file.name
print "mode pembacaan file : ", sebuah_file.mode
80
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
print "isi file : \n"
for line in sebuah_file:
print line
print "posisi pointer pada file : ", sebuah_file.tell()
print "kembali lagi ke awal : ", sebuah_file.seek(0, 0)
print "isi file : \n"
for line in sebuah_file:
print line
print "posisi pointer pada file : ", sebuah_file.tell()
sebuah_file.close()
print "apakah filenya udah ditutup ? : ", sebuah_file.closed
except IOError, e:
print "proses gagal karena : ", e
Pada contoh diatas, pointer file dipindahkan kembali ke posisi awal. Dengan memberikan jarak 0,
dan menentukan patokan di awal file, maka posisi pointer file pindah ke bagian awal file. Dengan
demikian file bisa dibaca ulang untuk kedua kalinya.
<< gambar 9.5 hasil eksekusi file_5.py >>
81
Mengganti Nama File
Dalam manipulasi file, terdapat operasi seperti pengubahan nama file, memindahkan file, ataupun
menghapus file. Python sendiri menyediakan module os yang didalamnya terdapat fitur- fitur
tersebut. Sebagai contoh pertama kita akan mengganti nama file dari “absen.txt” ke “daftar-
hadir.txt”. Pertama kita harus meng-import modul os. Kemudian kita gunakan method rename().
Method tersebut memiliki dua parameter yaitu nama file yang akan diubah namanya, dan nama baru
yang diinginkan.
listing : file_6.py
import os
try:
os.rename('absen.txt', 'daftar-hadir.txt')
print "Nama file sudah diubah.."
except (IOError, OSError), e:
print "proses error karena : ", e
Setelah kode diatas dijalankan, coba lihat file yang sebelumnya “absen.txt” akan berubah menjadi
“daftar-hadir.txt”.
<< gambar 9.6 hasil eksekusi file_6.py >>
Menghapus File
Contoh lainnya adalah menghapus file. Kita bisa gunakan method remove() untuk menghapus file
yang diinginkan. Parameter yang dibutuhkan adalah nama file yang akan dihapus.
listing : file_7.py
82
import os
try:
os.remove('daftar-hadir.txt')
print "File sudah dihapus.."
except (IOError, OSError), e:
print "proses error karena : ", e
Kemudian jika file sudah dihapus, kita tidak dapat membuka file tersebut. Karena file tersebut sudah
hilang dari penyimpanan sekunder.
<< gambar 9.7 hasil eksekusi file_7.py >>
Untuk contoh – contoh lainnya Anda bisa membuka dokumentasi resmi Python, atau coba kunjungi
beberapa website yang ada di lampiran – 2.
83
10. Pengenalan Class
Membuat Class dan Object
Pemrograman berorientasi objek atau dalam bahasa inggris dikenal dengan Object Oriented
Programming (OOP), merupakan sebuah paradigma pemrograman dimana kita memodelkan
perangkat lunak kita dari berbagai kumpulan objek yang saling berinteraksi. Objek tersebut
memiliki karakteristik dan aksi. Di dalam OOP, karakteristik tersebut berupa variabel yang
dinamakan atribut. Kemudian aksi yang dimiliki objek tersebut berupa method yang menghasilkan
output atau cuma melakukan aksi saja tanpa output. Ada istilah lain juga yang menyebut aksi
sebuah objek sebagai perilaku atau behaviour. Objek itu sendiri mempunyai template yang
diistilahkan dengan kelas atau class. Sebuah kelas merupakan template bagi objek – objek yang
akan dibuat. Proses pembuatan objek baru dinamakan dengan instansiasi.
Ada beberapa hal yang harus diingat dalam membuat sebuah kelas. Pertama keyword class,
keyword ini digunakan untuk mendefinisikan sebuah kelas. Disusul dengan nama kelas yang
diinginkan dan tanda titik dua. Blok kode kelas tersebut ditulis setelah tanda titik dua tersebut, dan
seperti biasa diperlukan indentasi agar blok kode yang kita tulis masuk kedalam blok kode kelas.
Kedua adalah konstruktor, di Python konstruktor ditulis dengan sebuah function bernama
__init__() . Method dan function sebenarnya sama, hanya saja beda istilah pada paradigma OOP.
Method __init__() ini merupakan method yang akan selalu dieksekusi saat instansiasi objek.
Biasanya __init__() digunakan untuk mengisi variabel dengan nilai awal pada atribut – atribut yang
dimiliki objek. Ketiga adalah keyword self, keyword tersebut digunakan pada method yang akan
dinyatakan sebagai method dari kelas yang kita rancang. Keyword ini disertakan di parameter
pertama. Jika method tersebut tidak disertakan self pada method yang dimiliki kelas tersebut, akan
muncul error : “TypeError: nama_function() takes exactly n arguments (1 given)
” yang artinya method tersebut tidak bisa dipanggil oleh objek yang telah terinstansiasi.
Sebagai contoh disini kita akan membuat sebuah kelas bernama PersegiPanjang yang memiliki dua
atribut yaitu panjang dan lebar. Kelas ini memiliki lima method yang terdiri dari :
__init__(), konstruktor kelas persegi panjang
hitung_luas(), method untuk menghitung luas persegi panjang
hitung_keliling(), method untuk menghitung keliling persegi panjang
gambar_persegi_panjang(), menggambar persegi panjang yang direpresentasikan dengan
kumpulan bintang.
gambar_persegi_panjang_tanpa_isi(), menggambar persegi panjang tetapi hanya batas
luarnya saja, isinya tak digambar.
listing : class_1.py
84
class PersegiPanjang:
def __init__(self, panjang, lebar):
self.panjang = panjang
self.lebar = lebar
def hitung_luas(self):
return self.panjang * self.lebar
def hitung_keliling(self):
return (2*self.panjang) + (2*self.lebar)
def gambar_persegi_panjang(self):
for i in range(0, self.lebar):
for j in range(0, self.panjang):
print '*',
print ""
def gambar_persegi_panjang_tanpa_isi(self):
for i in range(0, self.lebar):
if i > 0 and i < self.lebar-1:
for j in range(0, self.panjang):
if j > 0 and j < self.panjang-1:
print ' ',
else:
print '*',
else:
for j in range(0, self.panjang):
print '*',
print ""
PersegiPanjangA = PersegiPanjang(20, 10)
PersegiPanjangB = PersegiPanjang(10, 5)
print "Panjang persegi panjang A :", PersegiPanjangA.panjang
print "Lebar persegi panjang A :", PersegiPanjangA.lebar
print "Luas persegi panjang A : ", PersegiPanjangA.hitung_luas()
print "Keliling persegi panjang A : ", PersegiPanjangA.hitung_keliling()
print "Menggambar Persegi Panjang A : "
PersegiPanjangA.gambar_persegi_panjang()
print "\nMenggambar Persegi Panjang A hanya tepinya saja : "
PersegiPanjangA.gambar_persegi_panjang_tanpa_isi()
print "\n"
print "Panjang persegi panjang B :", PersegiPanjangB.panjang
print "Lebar persegi panjang B :", PersegiPanjangB.lebar
print "Luas persegi panjang B : ", PersegiPanjangB.hitung_luas()
85
print "Keliling persegi panjang B : ", PersegiPanjangB.hitung_keliling()
PersegiPanjangB.gambar_persegi_panjang()
print "\nMenggambar Persegi Panjang B hanya tepinya saja : "
PersegiPanjangB.gambar_persegi_panjang_tanpa_isi()
Proses instansiasi dilakukan dengan menentukan nama objek yang diinginkan kemudian panggil
nama kelas yang akan diinginkan dan masukan parameter awal yang dibutuhkan. Kemudian saat
objek berhasil dibuat, kita bisa mengakses atribut dan method dari objek tersebut. Seperti yang kita
lakukan pada manipulasi file, kita bisa mengakses method close(), write(), dan read() serta
mengakses atribut close, name, dan mode. Dengan parameter berbeda namun karakterisitik sama,
persegi panjang yang dihasilkan jadi beragam.
Tujuan dari OOP ini sendiri, menghemat penulisan kode program yang kita buat. Tanpa OOP kita
harus membuat atribut untuk setiap objek. Dan penulisan kode program pun menjadi menumpuk,
Karena untuk method yang sama harus di tulis ulang.
<< gambar 10.1 hasil eksekusi class_1.py bagian ke - 1 >>
86
<< gambar 10.2 hasil eksekusi class_1.py bagian ke - 2 >>
Mengenal Built-in Function pada Class dan Object
Berikutnya kita akan mengenal beberapa built-in class attribute yang akan bisa digunakan saat kita
membuat kelas apapun. Built-in class attribute akan selalu menyertai kelas yang kita rancang.
Berikut beberapa atribut yang bisa Anda gunakan untuk mengakses informasi dari sebuah kelas :
__doc__, digunakan untuk mengakses dokumentasi yang terdapat pada kelas
__name__, digunakan untuk mengakses nama kelas
__dict__, digunakan untuk mendapatkan namespace dari kelas tersebut. Kalau pada objek
yang sudah diinstansiasi method ini akan mengeluarkan informasi tentang atribut yang
sudah terisi nilai
__module__, digunakan untuk mendapatkan informasi dimana lokasi modul yang
mendefinisikan kelas tersebut
__bases__, digunakan untuk melihat darimana kelas tersebut diwariskan. Pewarisan pada
OOP adalah memakai karakteristik suatu kelas pada kelas yang ingin memakai
karakteristik kelas yang mewariskannya.
Sebagai contoh ada beberapa built-in class attribute yang bisa diakses kelas dan objek hasil
instansiasi dan ada yang hanya bisa diakeses kelas.
87
listing : class_2.py
class PersegiPanjang:
'''
Sebuah kelas yang memodelkan persegi panjang.
Mempunyai dua atribut yaitu panjang dan lebar.
Bisa menghitung luas dan keliling.
Bisa juga menggambar persegi panjang sesuai atribut
'''
def __init__(self, panjang, lebar):
self.panjang = panjang
self.lebar = lebar
def hitung_luas(self):
return self.panjang * self.lebar
def hitung_keliling(self):
return (2*self.panjang) + (2*self.lebar)
def gambar_persegi_panjang(self):
for i in range(0, self.lebar):
for j in range(0, self.panjang):
print '*',
print ""
def gambar_persegi_panjang_tanpa_isi(self):
for i in range(0, self.lebar):
if i > 0 and i < self.lebar-1:
for j in range(0, self.panjang):
if j > 0 and j < self.panjang-1:
print '-',
else:
print '*',
else:
for j in range(0, self.panjang):
print '*',
print ""
PersegiPanjangA = PersegiPanjang(20, 10)
print PersegiPanjang.__doc__
print PersegiPanjang.__name__
print PersegiPanjang.__dict__
print PersegiPanjang.__module__
print PersegiPanjang.__bases__
88
print PersegiPanjangA.__doc__
print PersegiPanjangA.__dict__
print PersegiPanjangA.__module__
Pada contoh diatas, atribut __name__ dan __bases__ hanya bisa diakses oleh kelas. Sedangkan
objek hasil instansiasi tidak bisa mengaksesnya.
<< gambar 10.3 hasil class_2.py >>
Pembahasan mengenai OOP ini tidak bisa dibahas secara keseluruhan dalam satu bab. Ada banyak
hal yang harus diulas seperi inheritance, polymorphism, abstract, overriding, overload, dan lain –
lain.
11. Pengenalan Module
89
Module dan Packages
Module adalah istilah file yang berisi kode Python. Jadi dari awal sebenarnya kita sudah membuat
module Python. Hanya saja pada konsep module ini, kode Python yang akan digunakan berulang
akan dipisahkan dari file utama ke dalam file lain yang khusus menampung kode Python tersebut.
Di dalam module kita bisa menyimpan class, function, variabel, dan struktur data yang bisa
digunakan oleh program. Misal kita ingin membuat sebuah kode yang hanya berisi jenis – jenis
segitiga seperti segitiga sama kaki, segitiga sembarang, segitiga sama sisi, dan segitiga siku – siku.
Kenapa tidak dicampur saja dengan jenis bidang yang lain ? Hal ini dilakukan agar kita mudah
dalam mengelola kode Python yang kita tulis. Contoh lainnya misal kita menulis kode yang
berinteraksi dengan database dan kode untuk melakukan proses penulisan laporan secara terpisah.
Dalam hal ini module mempunyai kode Python yang reusable agar kode yang ditulis pada program
kita terduplikasi. Sedangkan file Python yang akan dijalankan dan memanggil function, class, atau
variabel dari kumpulan module yang dibuat berisi runnable code. Kode yang dieksekusi oleh
interpreter Python untuk menampilkan wujud dari program yang dibuat.
Kemudian module – module yang sudah ditulis bisa dikelompokan kedalam sebuah package.
Package ini sendiri berupa folder yang memiliki file __init__.py, agar folder tersebut dikenali
sebagai module. Di dalam package ini module – module memiliki tujuan dan fungsional yang
seragam. Misal pada contoh yang akan kita coba, terdapat sebuah package bidang, yang berisi
module bidang segitiga dan persegi. Di dalamnya terdapat file __init__.py yang bertugas untuk me-
load semua module yang ada di dalam package, segitiga.py yang berisi class segitiga, dan
persegi.py yang berisi class persegi. Di dalam file segitiga.py dan persegi.py masing – masing bisa
diisi berbagai jenis bidang yang sesuai nama module tersebut. Hanya saja untuk contoh kali ini
dibatasi kepada satu jenis bidang saja
Membuat Module – Module di dalam Packages
Setelah memahami konsep module, mari kita coba program yang agak banyak ini. Sebelumnya di
direktori tempat kita akan menulis program, terlebih dahulu buatlah sebuah folder baru bernama
bidang. Folder tersebut merupakan package yang akan menyimpan persegi.py, segitiga.py, dan
__init__.py.
listing : persegi.py
class Persegi:
def __init__(self, s):
self.sisi = s
def SetSisi(self, s):
self.sisi = s
def GetSisi(self):
return self.sisi
90
def HitungKeliling(self):
return 4 * self.sisi
def HitungLuas(self):
return self.sisi * self.sisi
Kode persegi.py diatas hanya bersegi class Persegi yang mempunyai atribut sisi dan method –
method-nya. Di dalam module ini kita bisa saja menulis kelas PersegiPanjang. Hal tersebut
memudahkan kita agar bidang yang jenisnya persegi tidak tercampur dengan bidang yang jenisnya
segitiga. Pastikan Anda menyimpan file persegi.py di dalam folder bidang.
listing : segitiga.py
import math
class Segitiga:
def __init__(self, a, t):
self.alas = a
self.tinggi = t
def SetAlas(self, a):
self.alas = a
def GetAlas(self):
return self.alas
def SetTinggi(self, t):
self.tinggi = t
def GetTinggi(self):
return self.tinggi
def GetSisiMiring(self):
return math.sqrt(self.alas**2 + self.tinggi**2)
def HitungKeliling(self, s):
return self.alas + self.tinggi + s
def HitungLuas(self):
return (self.alas * self.tinggi) / 2
Hampir sama dengan fungsi dari module persegi.py, hanya saja module segitiga.py akan diisi
berbagai jenis segitiga. Selain itu pada kode diatas kita memanggil module math karena saat nanti
module segitiga.py ini diload, kode yang memakai method – method pada math harus di load
juga dari module math. Pastikan module ini tersimpan di folder bidang.
91
listing : __init__.py
from segitiga import Segitiga
from persegi import Persegi
if __name__ == '__main__':
pass
Kemudian file yang mesti ada di dalam sebuah package adalah __init__.py. File tersebut berfungsi
untuk me-load isi module ke dalam memori agar isi module bisa digunakan di file yang berisi
runnable code. Pada kode diatas, terdapat sintaks : from segitiga import Segitiga. Keyword from
adalah keyword yang digunakan untuk menentukan package atau module mana yang akan kita
rujuk, sedangkan import digunakan untuk mengambil class, function atau variabel yang
didefinisikan di dalam module. Disana kita meng-import dua buah kelas yaitu Segitiga dan Persegi
dari dua module berbeda yaitu segitiga.py dan persegi.py. Sedangkan kode dibawahnya digunakan
jika file __init__.py ingin menjalankan perintah tertentu. Pastikan file ini disimpan di folder bidang.
memakai Module di File Utama
Sampai akhirnya kita tiba untuk menulis kode utama. Kode utama ini merupakan kode yang berisi
runnable code, dan memakai class yang sudah didefinisikan di module – module sebelumnya.
Dengan demikian kode program tidak akan menumpuk di file utama.
Jika Anda berhasil mengikuti petunjuk pada bab ini, module, packages dan file utama harus
mempunyai sususan seperti berikut :
<< gambar 12.1 struktur module packages bidang >>
listing : main.py
92
from bidang import Segitiga, Persegi
sgtgA = Segitiga(3, 9)
prsgA = Persegi(5)
print "Luas Segitiga A : ", sgtgA.HitungLuas()
print "Sisi Miring Segitiga A : ", sgtgA.GetSisiMiring()
print "Keliling Segitiga A : ", sgtgA.HitungKeliling(sgtgA.GetSisiMiring())
print "\n"
print "Luas Persegi A : ", prsgA.HitungLuas()
print "Keliling Segitiga A : ", prsgA.HitungKeliling()
Pada kode diatas kita meng-import kelas dari package bidang. Kemudian melakukan instansiasi dan
memberikan nilai sesuai yang kita inginkan. Kemudian kita akses method – method yang terdapat
pada kelas tersebut untuk mendapatkan informasi luas, dan keliling pada masing – masing bidang.
Jika berhasil maka kode yang akan dijalankan seperti berikut :
<< gambar 12.2 eksekusi main.py >>
93