Tuesday, 9 June 2015

29.Exceptions

Exception adalah suatu objek juga, dan ada banyak class exception yang ada di class build-in, Semua exception itu berasal dari class yang bernama 'BaseException'.

Exception digunakan untuk menangani jalannya program, bila sesuatu yang tidak diharapkan terjadi, dengan exception maka kesalahan ini bisa diketahui.

Ada beberapa exception yang bisa kita lakukan :

  1. try/except - Menangkap dan kembali ke program yang ditangani oleh Pyhon atau kita.
  2. try/finally - Melakukan pembersihan, dengan atau tidak ada exception yang terjadi.
  3. raise - melakukan exception dengan kode yang kita buat.
  4. assert - Kondisi yang terjadi pada sebuah exception yang kita buat.
  5. with/as - Pada python 2.6, 3.0 dan yang terbaru, mengimplementasikan context manager.

Exception digunakan untuk menangkap sesuatu yang tidak biasa, atau adanya error, kesalahan memasukan data, dan lain-lain. Misalnya (jangan diasumsikan contoh ini dalam program, illustrasi ini hanya terjadi pada kehidupan, tapi bisa juga dibuat programnya.) kita misalnya bermain sepak bola, kita tahu semua pelaturannya. Ketika kita main bola, tiba-tiba ada meteor jatuh ditempat gawang lawan, dan kita pas menendang tepat kearah gawang yang tidak dijaga oleh lawan. Harusnya itu masuk, tetapi karena gawangnya jadi gepeng oleh meteor sehingga ini jadi permasalahan, ini yang ditangkap oleh exception. Bila pada sepakbola ada exception, maka kejadian ini diambil alih oleh exception standar, atau exception yang kita buat sendiri, dan permainan bisa berlanjut kembali (bila ada gawang cadangan) seakan-akan tidak ada kejadian yang aneh.

Peran dari exception ini biasanya untuk mengatasi error, pemberitahuan kejadian yang jarang, kasus-kasus yang tidak biasa, melakukan penghentian program, dan juga membuat flow control program yang tidak biasa.

  1. >>> def met(objek1,index1):
  2. return objek1[index1]

  3. >>> aa='hello'
  4. >>> met(aa,3)
  5. 'l'
  6. >>> 


Contoh diatas merupakan hal yang memang diharapkan, tapi bila kita tulis :

  1. >>> met(aa,8)
  2. Traceback (most recent call last):
  3.   File "<pyshell#5>", line 1, in <module>
  4.     met(aa,8)
  5.   File "<pyshell#2>", line 2, in met
  6.     return objek1[index1]
  7. IndexError: string index out of range
  8. >>> 


Karena index pada variable aa tidak sampai 8, maka error message dikeluarkan dan kita tidak memiliki exception. Pada contoh diatas error message yang terjadi merupakan sebuah exception standar. 

Pada contoh diatas kita mendapatkan pesan bahwa index ada kesalahan (baris ke 7) IndexError: string index out of range.

Kita coba menggunakan message exception yang kita buat sendiri:

  1. >>> try:
  2. met(aa,8)
  3. except IndexError:
  4. print('indexnya salah euy')

  5. indexnya salah euy
  6. >>> 

Sekarang kita mendapatkan pesan yang kita buat sendiri.

Contoh diatas merupakan kesalahan standar yang ada pada python. Kita juga bisa membuat exception yang menurut python tidak ada kesalahan dengan menggunakan perintah raise:

  1. >>> try :
  2. raise IndexError
  3. except IndexError:
  4. print ('error yang kita buat')

  5. error yang kita buat
  6. >>> 
Contoh diatas kita membuat sesuatu yang terjadi normal menjadi error.

Membuat sebuah class exception sendiri yang kita sendiri membuat aturannya mainnya. Kira-kira seperti ini class-nya:

  1. class exceptku(Exception):
  2.      print('masuk class')

  3. def errku():
  4.      print('masuk def errku')
  5.      raise exceptku()

  6. print ('mulai')
  7. try:
  8.      print('masuk try')
  9.      errku()
  10. except exceptku:
  11.      print('masuk except')







28.Polymorphism

Polymorphism adalah kebiasaan  yang berbeda, tergantung pada subclass mana yang digunakan, tanpa mengetahui subclass mana yang dibekerja. Seperti pada file-file audio misalnya dengan extension mp3 atau wav pada media player seperti vlc player untuk memutar video atau musik, kita tinggal pilih filenya (bisa video atau audio) lalu media player memutarkan file tersebut sesuai dengan extension filenya. Jika extension file-nya mp3 maka class audio yang akan digunakan, jika extension file-nya 3gp misalnya, maka class video yang akan digunakan. Pada programnya kita cukup menuliskan 'namaAudioFile.play()' seperti itu.

Bila kita gali lebih dalam, contohnya audio file saja, dengan extension wav yang disimpan dalam storage tanpa di compress, sedangkan mp3 merupakan file audio yang dikompress. file audio yang dikompres mp3 dan wma misalnya, memiliki kompresi algorithms yang berbeda, tapi dengan prinsip polymorphism setiap extension file menggunakan class yang berbeda-beda. Pada setiap class memiliki metode play() yang berbeda-beda, dan media play tersebut tidak perlu mengetahui subclass mana yang akan digunakan. 

Kita lihat kerangka kasarnya (contoh dibawah tidak benar-benar menyalakan memutar musik, tapi hanya mengganti keterangan kondisinya saja):
  1. class cAudio:
  2.      def __init__(self,Filename):
  3.           if not Filename.endswith(self.ext):
  4.                raise Exception('file tidak dikenal sebagai audio file')
  5.           self.Filename=Filename

  6. class mp3File(cAudio):
  7.           ext='mp3'
  8.           def play(self):
  9.                print('playing {}.mp3'.format(self.Filename))

  10. class WavFile(cAudio):
  11.           ext='wav'
  12.           def play(self):
  13.                print('playing{}.wav'.format(self.Filename))

  14. class rmFile(cAudio):
  15.           ext='rm'
  16.           def play(self):
  17.                print('playing{}.rm'.format(self.Filename))

  18. class wmaFile(cAudio):
  19.           ext='wma'
  20.           def play(self):
  21.                print('playing{}.wma'.format(self.Filename))
bila kita input:
  1. >>> aa=mp3File('sss.mp3')
  2. >>> aa.play()
  3. playing sss.mp3.mp3
  4. >>> bb=rmFile('df.rm')
  5. >>> bb.play()
  6. playingdf.rm.rm
  7. >>> cc=mp3File('dfe.aaa')  # kita menggunakan ext file yang tidak sesuai
  8. Traceback (most recent call last):
  9.   File "<pyshell#4>", line 1, in <module>
  10.     cc=mp3File('dfe.aaa')
  11.   File "C:\Python34\PythonFiles\audio.py", line 4, in __init__
  12.     raise Exception('file tidak dikenal sebagai audio file')
  13. Exception: file tidak dikenal sebagai audio file
  14. >>> 
Kita bisa lihat pada contoh diatas, superclass cAudio bisa mengakses (__init__ metode) variable ext disetiap subclass.








Python 3 Object Oriented Programming
Harness the power of Python 3 objects
Dusty Phillips

Sunday, 7 June 2015

27.Multiple Inheritance

Multiple inheritance pada prinsipnya sebuah class yang merupakan pewaris lebih dari satu class (parent class, yang menjadi superclass dari class tersebut). Walupun pada kenyataanya menjadi sesuatu yang komplek, dan banyak programer yang menghindari multiple inheritance ini. Ini disebabkan kelebihannya dari multiple inheritance ini hanya sedikit, dan lebih banyak mendapatkan masalah.

Jadi untuk membuat multiple inheritance, kita harus benar-benar tahu kita memerlukan ini, bukan hanya sepertinya kita perlu multiple inheritance.

Syntax dari multiple inheritance ini seperti ini:

class namaclass(parentClass1, parentClass2, parentClass3,...)


26.Overriding

Bila kita tidak puas dengan objek (metode, variable dan lain-lain) yang ditawarkan oleh superclass, kita juga bisa meng-overriding-nya. Kita bisa memodifiksi metode yang ada di superclass. Untuk overriding sebuah metode kita tidak perlu sesuatu yang lain dengan pyton, kita tinggal membuat class dan mengganti yang ada pada superclass dengan yang baru (dengan nama yang sama).

Contoh sebelumnya:
  1. class kontak:
  2.      semuaKontak=[]

  3.      def __init__(self, nama1, noTlp1):
  4.           self.nama=nama1
  5.           self.noTlp=noTlp1
  6.           kontak.semuaKontak.append(self)

  7. class subClass(kontak):
  8.      def cetak(self, komen):
  9.           print('nama = {}, no telepon ={}, {}'.format(self.nama,self.noTlp,komen))

Class kontak merupakan subclass dari class object, dan merupakan superclass dari class 'subClass', Kita bicara soal class 'kontak' dan class 'subClass' saja. Bila kita ingin mengubah class 'superclass kontak' kita bisa membuat class yang lain:
  1. class overrideSuperClassKontak(kontak):
  2.      def __init__(self, nama1, noTlp1, noHp1):
  3.           self.nama=nama1
  4.           self.noTlp=noTlp1
  5.           self.noHp=noHp1

 jadi program kita akan terlihat seperti ini:
Pada class yang baru kita buat ini (class 'overrideSuperClassKontak') kita mengubah kebiasaan dari superclass 'kontak', yang bisanya kita menginitialkan hanya nama dan noTlp saja. Pada subclass 'overrideSuperClassKontak' kita menambahkan initial 'noHp', overriding tidak sebatas menambahkan saja, bisa dikurangi, modifikasi, atau pun menjadi lain dari superclass nya sendiri, yang pasti nama metodenya harus sama.




25.Inheritance Dasar

Secara teknis, setiap class yang kita buat, menggunakan inheritance (mewarisi), semua class dan subclass merupakan objek. Pada class berisi data dan behavior, tapi tidak semua objek oleh python dipelukan sama.

Bila kita tidak mewarisi (inherit) dari class yang lain, class yang kita buat tetap mewarisi dari objek, walaupun demikian kita tetap bisa menggunakan objek (object) seperti syntax dibawah ini:


class subClassSatu(object):

     pass

secara teknik contoh diatas tidak berbeda dengan contoh-contoh sebelumnya. Pada python 3 semua class secara otomatis mewarisi dari objek, walaupun kita tidak memberikan superclass nya. 


Superclass adalah parent class, atau class yang ada diatasnya sebagai yang memberikan warisan. Sehingga contoh diatas (class subClassSatu) adalah subclass dari class object. 


Pada subClassSatu memiliki akses ke metode-metode yang ada pada superclass yaitu class object, semua yang ada pada class object dapat dipergunakan oleh subClassSatu, tetapi apa yang ada di class subClassSatu tidak dapat dipergunakan oleh class object.


Dengan adanya subclass, kita bisa menabahkan minimal satu syntax lagi yang tidak ada pada superclass, caranya seperti diatas yaitu :

     class namaClass (namaSuperClass):
          pass

Dengan demikian kita memberitahukan python bahwa class 'namaClass' merupakan turunan dari class 'namaSuperClass', sehingga 'namaClass' dapat mempergunakan semua objek yang ada pada 'namaSuperClass', dan ada penambahan objek yang lain, yang tidak ada pada 'namaSuperClass' yang ditambahkan.


Contoh dari inheritance:


  1. class kontak:
  2.      semuaKontak=[]

  3.      def __init__(self, nama1, noTlp1):
  4.           self.nama=nama1
  5.           self.noTlp=noTlp1
  6.           kontak.semuaKontak.append(self)

     
Class diatas merupakan pewaris dari class object, yang isinya hanyalah sebuah variable list baru 'semuaKontak'. Sehingga bila kita memanggil self.semuaKontak pada setiap objeknya maka akan menujukan ke satu variable yang sama. Dan fungsi def diatas hanyalah untuk menambahkan kontak-kontak yang baru ke variable list 'semuaKontak'.

Lalu kita buat subclass,



  1. class subClass(kontak):
  2.      def cetak(self, komen):
  3.         print('nama = {}, no telepon ={}, {}' .format (self.nama, self.noTlp, komen))





Pada contoh diatas kita lihat, objek c adalah class subClass yang merupakan subclass dari class kontak, sehingga objek c harus menginitial kan nama dan noTlp. 


objek a dan b merupakan superclass dari subClass, sehingga objek-objek tersebut tidak bisa mengakses fungsi cetak pada class subClass.


Dan objek c dapat mengakses variable list 'semuaKontak' yang berada di superclass kontak.


Kita coba:



  1. >>> c.semuaKontak
  2. [<__main__.kontak object at 0x0000000003545EB8>, <__main__.kontak object at 0x00000000035B0D68>, <__main__.subClass object at 0x00000000035B0DA0>]
  3. >>> a.cetak('hello')
  4. Traceback (most recent call last):
  5.   File "<pyshell#1>", line 1, in <module>
  6.     a.cetak('hello')
  7. AttributeError: 'kontak' object has no attribute 'cetak'
  8. >>> c.cetak('hello')
  9. nama = ccc, no telepon =555, hello
  10. >>> [d.nama for d in kontak.semuaKontak]
  11. ['aaa', 'bbb', 'ccc']
  12. >>> 


Pada baris pertama kita mencoba mengakses variable 'semuaKontak' dengan objek c, kita mendapakan alamat memorynya, objek c diizinkan mengakses variable 'semuaKontak' yang ada pada class kontak.

Pada baris ketiga. objek a yang merupakan class 'kontak' mencoba masuk kedalam class 'subClass' mendapatkan pesan error


Pada baris kedelapan, objek c mengakses class nya sendiri.


Pada baris kesepuluh kita mengakses semua nama yang ada di variable 'semuaKontak', class 'kontak'.