Python for Data Prof Beginner Part 3 - nurkomarhidaya/DQLab GitHub Wiki

1. Pengantar Object Oriented Programming

Pengantar Object Oriented Programing

Aku sudah sampai di modul ketiga pembelajaran Python. Kalau modul pertama aku masih bisa bilang lancar-lancar saja dan modul dua kian menantang, di modul ketiga ini aku masih belum punya gambaran.

Kuintip judul pertama pembelajaran modul ketiga berisi “Pengantar Object Oriented Programming”, “Classes & Objects”, “Encapsulation”, hingga “Polymorphism”. Waduh! Nama makhluk apa semua itu? “Kok diintip aja? Lanjut dong,” celetuk Senja di sebelahku. “Hehehe, siap. Kalau enggak paham, nanya-nanya boleh dong?” “Silakan.” Nah, kalau ada yang siap membimbing bakal semangat nih. Aku mulai membuka isi modul ketiga ini.

Apa itu Object Oriented Programing?

Pemrograman Berbasis Objek (Object Oriented Programming - OOP) merupakan salah satu paradigma pemrograman yang cukup populer di antara paradigma-paradigma lainnya.

Pada paradigma OOP, struktur dari sebuah program dikemas ke dalam sebuah objek yang memiliki serangkaian properti (properties) dan fungsi (behaviours). Sebagai contoh, aku dapat merepresentasikan seorang karyawan ke dalam sebuah program melalui konsep OOP.

Seorang karyawan dapat memiliki serangkaian properti seperti nama, usia, keahlian, dll. Kemudian, seorang karyawan juga dapat memiliki fungsi-fungsi seperti hadir ke kantor, absen, lembur, tugas dinas, dll.

Konsep dalam Object Oriented Programing

Sebagai salah satu bahasa pemrograman yang bersifat multi-purposive, Python juga mendukung paradigma Object Oriented (OO).

Konsep OO pada Python memiliki tujuan untuk menciptakan potongan-potongan kode yang bersifat reusable dan tidak redundan. Konsep ini dikenal dengan istilah konsep DRY - Don’t Repeat Yourself (berlawanan dengan konsep WET - Write Everything Twice).

Dalam bahasa pemrograman Python, terdapat 3 konsep utama OO yaitu.

  1. Encapsulation: Menyembunyikan sebagian detail yang dimiliki oleh sebuah objek terhadap objek-objek lainnya.
  2. Inheritance: Menurunkan serangkaian fungsi-fungsi yang dimiliki oleh sebuah objek ke sebuah objek baru tanpa mengubah makna dari objek acuan yang digunakan.
  3. Polymorphism: Konsep untuk menggunakan fungsi-fungsi dengan nama/tujuan yang sama dengan cara yang berbeda.

Quiz

image

Quiz

image

Quiz

image

2. Classes & Objects

Class dan Objek dalam Python - Part 1

Setiap objek yang aku representasikan dalam program berbasis OOP merupakan instansi/ bentuk nyata dari sebuah konsep yang disebut dengan class. Oleh karena itu, class dapat juga aku sebutkan sebagai kerangka utama (blueprint) dari objek. Untuk mempermudah pemahaman konsep OO, aku menggunakan contoh berikut:

Asumsikan aku ingin merepresentasikan Diriku dan Senja sebagai karyawan di suatu perusahaan X. Untuk merepresentasikan Diriku dan Senja, aku dapat membuat sebuah class yang nantinya akan mencakup properti-properti yang umumnya dimiliki oleh sebuah karyawan.

Pada bahasa Python aku dapat membuat sebuah class dengan menggunakan syntax berikut.

image

Kemudian, dari class yang telah aku definisikan, aku dapat menciptakan objek (Diriku dan Senja) dari sebuah class dengan menggunakan syntax berikut.

image

Pada contoh di atas, Aku dan senja merupakan realisasi (objek) dari class Karyawan yang sebelumnya telah aku buat. Dari potongan kode ini, aksara dan senja adalah dua objek yang berbeda.

Class dan Objek dalam Python - Part 2

Pada bagian pertama, aku telah berhasil membuat sebuah class dan objek-objek sebagai bentuk realisasi dari sebuah class. Akan tetapi, class yang telah aku definisikan belum memiliki atribut ataupun fungsi-fungsi yang dapat merepresentasikan objek Karyawan dengan baik.

Agar dapat membuat class Karyawan dengan baik, pertama, aku akan mempelajari cara merepresentasikan atribut/properti dalam sebuah class. Dalam sebuah class, aku dapat mendefinisikan dua jenis atribut yaitu.

  1. Class Attribute adalah properti/atribut yang bernilai sama untuk oleh seluruh objek
  2. Instance Attribute adalah properti/atribut yang nilainya berbeda-beda untuk setiap objek dari sebuah class.

Class dan Objek dalam Python - Part 3

Berkaitan dengan kedua jenis atribut yang telah aku pelajari, aku menggunakan contoh berikut untuk memperkuat pemahamanku terkait dengan konsep class attribute.

Class Karyawan pada umumnya memiliki beberapa atribut seperti nama, usia, pendapatan serta nama perusahaan di mana karyawan tersebut bekerja. Untuk merepresentasikan diriku dan Senja sebagai karyawan yang bekerja di sebuah perusahaan yang sama (anggap saja perusahan ABC), aku dapat merepresentasikan dengan menggunakan konsep class attribute

image

Menggunakan potongan kode di atas, nama_perusahaan sebagai class attribute dapat kita akses dengan menggunakan syntax:

image

Kemudian, sesuai dengan konsep yang telah aku pelajari sebelumnya, saat aku mengubah nilai atribut yang merupakan sebuah class attribute, nilai dari atribut akan berubah untuk seluruh objek.

Saat perusahaan berubah nama, misalkan nama perusahaan berubah dari 'ABC' ke 'DEF', dikarenakan atribut nama_perusahaan merupakan sebuah class attribute, aku hanya cukup mengganti nama_perusahaan pada salah satu objek saja (tidak perlu mengganti nama_perusahaan milik seluruh objek). Contohnya:

image

Tugas: Aku di minta untuk mengerjakan tutorial sederhana untuk membantu memahami konsep OOP:

  1. Definisikan Class Karyawan
  2. Inisiasi object yang dinyatakan dalam variabel Aksara dan Senja
  3. Cetak Nama Perusahaan melalui penggunaan keyword class
  4. Ubah Nama Perusahaan menjadi 'DEF'

image

Class dan Objek dalam Python - Part 4

Pada bagian sebelumnya aku telah mempelajari contoh deklarasi class Karyawan; nama, usia dan pendapatan karyawan adalah contoh dari konsep instance attribute. Hal ini dikarenakan setiap karyawan tentunya dapat memiliki nama, usia dan pendapatan yang berbeda.

Tugas: Untuk merepresentasikan instance attribute milik Aksara, aku mengetik potongan kode berikut pada live code editor:

image

Selanjutnya, untuk merepresentasikan instance attribute milik Senja, aku mengetik potongan kode berikut pada live code editor:

image

image

image

Quiz

image

Quiz

image

Behavior pada Class

Selain dapat mendefinisikan atribut, dalam sebuah class, aku diperbolehkan untuk mendefinisikan fungsi-fungsi (behavior) dari sebuah class.

Dari potongan kode yang telah aku gunakan, aku dapat menambahkan fungsi-fungsi berkaitan dengan class Karyawan. Sebagai contoh, seorang karyawan tentunya mungkin saja memiliki pendapatan tambahan berdasarkan banyaknya kerja lembur dan jumlah proyek yang telah diselesaikan.

Tugas: Untuk menghitung pendapatan tambahan dari jumlah kerja lembur dan jumlah proyek yang diselesaikan oleh seorang karyawan dan mengakses pendapatan total dari seorang karyawan, aku dapat menuliskan potongan kode berikut

image

untuk menambahkan pendapatan lembur diriku, aku dapat menggunakan fungsi lembur() pada objek aksara.

image

untuk menambahkan pendapatan tambahan proyek pada senja, aku dapat mengakses fungsi tambahan_proyek() pada objek senja

image

Selanjutnya, aku dapat menghitung total pendapatanku dan Senja

image

Layaknya proses pendefinisian fungsi pada Python, fungsi-fungsi dalam sebuah class juga dapat memiliki parameter (seperti fungsi tambahan_proyek dalam contoh) ataupun mengembalikan sebuah nilai (seperti fungsi total_pendapatan dalam contoh)

image

Tugas Praktek

Seperti biasa, aku selalu pusing setiap usai membaca teori data. “Gimana, Aksara?” tanya Senja tanpa memalingkan perhatian dari laptop.

“Kayaknya butuh praktik deh,” sahutku.

“Oke, ini coba kamu bikin sistem manajemen perusahaan sederhana pakai Object Oriented (OO) ya. Artinya dalam program ini kamu harus mampu memuat informasi nama, alamat, nomor telepon, dan daftar karyawan yang bekerja. Satu lagi, jangan lupa masukkan fungsi untuk mengaktifkan dan menonaktifkan karyawan.”

“Siap. Ini aku masukkan informasi class karyawan juga kali yah?” tanyaku sembari bersiap-siap memasukkan kode dan mendaftar informasi karyawan secara lebih rapi, mulai dari nama, usia, pendapatan tetap, tambahan, dan insentif lembur.

“Bagus juga itu. Bikin saja pendapatan mula-mula karyawannya bernilai 0, lalu bisa bertambah oleh fungsi lembur dan fungsi tambahan proyek sebagai parameter dan variabel pendapatan tambahan karyawan.”

Aku mengangguk dan siap bertempur. Terakhir aku menyelipkan fungsi untuk menghitung total pendapatan. Ini paling penting, hehehe.

Tugas: Lengkapi class Karyawan dan class Perusahaan menggunakan potongan kode pada Live Code Editor.

image

Tugas Praktek

image

image

https://codeshare.io/xvdrej

3. Encapsulation & Inheritance

Encapsulation pada Python - Part 1

Praktik tadi yang dibantu Senja, membuatku lebih percaya diri untuk lanjut ke materi selanjutnya mengenai “Encapsulation & Inheritance”. Ini apa lagi yah? Aku membolak-balik halaman modul materi ini. Aku bersemangat untuk memulai!

Enkapsulasi (Encapsulation) adalah sebuah teknik dalam OOP yang mengizinkan aku untuk menyembunyikan detil dari sebuah atribut dalam sebuah class. Pada contoh-contoh sebelumnya, setiap atribut dan fungsi yang telah aku definisikan belum menggunakan konsep enkapsulasi, yang mengartikan bahwa setiap atribut dan fungsi dapat diakses di luar class.

Pada potongan kode yang sebelumnya aku tuliskan,

image

Aku dapat mengakses setiap atribut milik class Karyawan secara langsung di luar scope milik class Karyawan. Sebagai contoh,

image

image

Encapsulation pada Python - Part 2

Pada contoh di atas, terlihat bahwa atribut nama pada setiap objek dapat diakses secara bebas di luar scope dari sebuah class. Agar suatu properti ataupun fungsi dari sebuah class tidak dapat diakses secara bebas di luar scope milik suatu class, aku dapat mendefinisikan access modifier (level akses) saat sebuah atribut/fungsi didefinisikan.

Terdapat 2 macam access modifier dalam Python, yakni.

  1. Public access: dapat aku definisikan dengan secara langsung menuliskan nama dari atribut/ fungsi. Dalam sebuah objek, atribut/fungsi yang bersifat public access dapat diakses di luar scope sebuah class
  2. Private access: dapat aku definisikan dengan menambahkan double underscore (__) sebelum menuliskan nama dari atribut/fungsi. Dalam sebuah objek, atribut/fungsi yang bersifat private access hanya dapat diakses di dalam scope sebuah class.

Tugas: Untuk memperkuat pemahamanku terkait konsep enkapsulasi dalam paradigma OO, aku menggunakan contoh syntax dan mengetiknya pada live code editor:

image

Pada potongan kode di atas, atribut nama_perusahaan bersifat publicyang mengartikan bahwa aku dapat mengakses atribut ini di luar scope class Karyawan

image

Kemudian, atribut __nama, __usia, __pendapatan_tambahan, __insentif_lembur dan pendapatan bersifat private sehingga atribut ini hanya dapat diakses di dalam scope class Karyawan.

Saat aku mencoba mengakses atribut-atribut ini di luar scope class Karyawan, Python akan mengembalikan error yang menyatakan bahwa class Karyawan tidak memiliki atribut tersebut. Sebagai contoh,

image

akan menyebabkan error yang menyatakan bahwa objek Karyawan tidak memiliki atribut __nama.

image

image

Quiz

image

Quiz

image

Inheritance pada Python - Part 1

Inheritance adalah salah satu mekanisme di konsep OO yang mengizinkan aku untuk mendefinisikan sebuah class baru berdasarkan class yang sebelumnya telah dideklarasikan.

Melalui konsep inheritance, sebuah class baru dapat memiliki atribut dan fungsi pada class yang sebelumnya telah didefinisikan. Pada konsep inheritance, atribut/fungsi yang akan diwariskan hanyalah atribut/fungsi dengan access modifier public, atribut/fungsi dengan access modifier private tidak akan diturunkan

Tugas: Definisikan class Karyawan pada Live Code Editor:

image

melakukan inheritance (menurunkan seluruh atribut dan fungsi dari class Karyawan) ke class AnalisData

image

objek AnalisData dapat mengakses fungsi lembur milik class Karyawan

image

Selanjutnya,

objek IlmuwanData dapat mengakses fungsi tambahan_proyek milik class Karyawan

image

Penjelasan:

Melalui potongan kode di atas, aku telah menerapkan konsep inheritance. Melalui konsep inheritance class AnalisData dan IlmuwanData akan memiliki setiap atribut dan fungsi yang dimiliki oleh class Karyawan (Hal ini dikarenakan seluruh atribut dan fungsi dari class Karyawan bersifat public).

Pada konsep inheritance, class AnalisData dan class IlmuwanData disebut sebagai child class dari class Karyawan; sehingga class Karyawan dapat disebut sebagai parent class dari class AnalisData dan IlmuwanData.

Suatu child class dapat mengakses atribut ataupun fungsi yang dimiliki oleh parent class dengan menggunakan fungsi super(). Pada contoh di atas, fungsi super() digunakan oleh child class (AnalisData dan IlmuwanData) untuk mengakses constructor yang dimiliki oleh parent class (Karyawan).

Catatan: Sebenarnya, aku tidak perlu mendefinisikan kembali fungsi (termasuk constructor) ataupun properti yang memiliki public access modifier di sebuah child class. Python akan secara otomatis mewariskan seluruh fungsi dan properti dengan public access modifier ke sebuah child class. Contoh potongan kode di atas hanya diperkenankan untuk mencontohkan penggunaan fungsi super().

image

https://codeshare.io/JbvV6d

Inheritance pada Python - Part 2

Pada bagian pertama aku telah mempelajari bagaimana child class mewarisi fungsi/atribut dari parent class dengan menggunakan fungsi super(). Melalui konsep inheritance, child class dapat memodifikasi atribut/ fungsi yang diwarisi oleh sebuah parent class dengan mendefinisikan ulang atribut/ fungsi menggunakan nama yang sama.

Tugas: Aku mencoba contoh berikut dengan Live Code Editor

image

image

Fungsi lembur pada objek aksara sebagai bagian dari class AnalisData akan menambahkan total_pendapatan milik objek sebesar 250000 mengikuti insentif_lembur milik class Karyawan

image

Selanjutnya,

fungsi lembur pada objek senja sebagai bagian dari class IlmuwanData akan menambahkan total_pendapatan milik objek sebesar 500000 dikarenakan class IlmuwanData telah mendefinisikan kembali nilai insentif lembur menjadi 500000

image

image

https://codeshare.io/Rby9OV

Quiz

image

Quiz

image

4. Polymorphism & Overloading

Polymorphism pada Python - Part 1

Selain dapat mendefinisikan ulang nilai dari atribut yang diwarisi oleh parent class seperti pada contoh di atas, aku juga dapat juga dapat mendefinisikan ulang fungsi yang telah diwarisi oleh parent class.

Saat aku mendefinisikan kembali fungsi yang telah diwarisi oleh parent class, secara tidak langsung aku telah menerapkan salah satu mekanisme yang secara khusus pada paradigma OO disebut dengan istilah polymorphism.

Tugas: Aku menerapkan Polymorphism dengan mengetik potongan kode berikut pada Live Code Edito

image

Aku melakukan pemanggilan konstruktur class Karyawan, menerapkan polymorphism dengan mendefinisikan kembali fungsi lembur() pada AnalisData, dan menambahkan 10% tambahan pendapatan pada class AnalisData

image

fungsi lembur() pada objek **aksara **sebagai bagian dari class AnalisData akan menambahkan total_pendapatan milik objek sebesar 850000 (10% dari pendapatannya) mengikuti definisi dari fungsi lembur() pada class AnalisData

image

image

https://codeshare.io/MNy8nq

Polymorphism pada Python - Part 2

Pada konsep inheritance, melalui fungsi super(), selain dapat mengakses constructor milik parent class, child class juga dapat mengakses atribut/fungsi yang dimiliki oleh parent class.

Tugas: Aku menggunakan potongan kode berikut dan mengetiknya pada Live Code Editor:

image

image

https://codeshare.io/JbyeJd

Tugas Praktek

Aku tak pernah membayangkan diriku benar-benar mengerjakan program untuk kebutuhan perusahaan. Seperti sekarang, aku sedang mengerjakan rikues untuk memenuhi penghitungan pembayaran fee karyawan lepas. Tapi tak apa. Sejak program yang terakhir berhasil, aku sedikit lebih percaya diri untuk menjawab tantangan baru. Sembari menyeruput kopi hangat, aku mulai memasukkan informasi yang cukup untuk membuat class Tenaga Lepas berisi nama, usia, dan pendapatan selama bergabung di sebuah proyek. Lalu, apa lagi ya? “Nja, mau nanya. Kalau karyawan lepas, insentif tambahannya dari uang lembur juga?” “Engga, Aksara. Di kantor kita, karyawan lepas dapat insentif dari proyek yang dikerjakan. Kalau hasilnya sukses bisa dapat 1% dari nilai proyek.” “Oke,” aku mencatat itu sebagai penghitungan akhir dan mulai menulis kodenya.

image

https://codeshare.io/X8vj0o

Tugas Praktek

Di luar sudah menggelap. Gerobak nasi goreng yang biasanya menunggu di depan kantor tiap pukul tujuh sudah tampak. Aku masih saja larut dalam pekerjaan.

“Masih di sini, Aksara? Belum pulang?” tegur Senja yang baru saja keluar dari ruangan.

“Masih ngurusin proyek Tenaga Lepas. Ini baru dapat rikues lagi untuk nambahin class yang merepresentasikan masing-masing pekerjaan di divisi ini.”

“Hmm, kamu pakai konsep inherintance saja, akan lebih mudah,” saran Senja sebelum pulang. Sejujurnya, aku juga mau pulang. Teringat kasur di rumah yang siap untuk rebahan. Kalau begitu, pekerjaan ini harus cepat diselesaikan.

Di divisiku ada empat bidang pekerjaan, mulai dari analisis data, ilmuwan data, pembersih data, dan dokumenter teknis. Setiap peran punya sistem penerimaan fee yang berbeda. Ini yang bikin rumit. Misalnya, ilmuwan data akan mendapat insentif tambahan sebesar 10% dari proyek yang dikerjakan, dan dokumenter teknis adalah satu-satunya peran yang tidak menerima insentif dari proyek.

Oke, tenang. Ini pasti bisa, tinggal masukkin saja variabelnya satu persatu. Semangat! batinku sembari ditemani suara abang nasi goreng yang menjajakan makanannya.

Aku kembali bekerja dengan data dan kode-kode ini di code editor.

image

https://codeshare.io/4e3NMK

Overloading

Pada bahasa pemrograman lain yang mendukung paradigma OO seperti C# ataupun Java, polymorphism juga dapat diterapkan melalui sebuah fitur yang dikenal dengan istilah metode overloading.

Metode overloading mengizinkan sebuah class untuk memiliki sekumpulan fungsi dengan nama yang sama dan parameter yang berbeda. Berkaitan dengan hal ini, Python tidak mengizinkan pendeklarasian fungsi (baik pada class ataupun tidak) dengan nama yang sama.

Untuk mengimplementasikan method overloading pada Python, aku dapat menggunakan sebuah teknik yang dikenal dengan function default parameters.

Tugas Praktek

image

image

https://codeshare.io/zyqLeD

5. Mini Quiz

Pendahuluan

Keesokan harinya, aku menerima kabar mengejutkan sekaligus membahagiakan dari Senja: aku lulus untuk pembelajaran programming dengan Object Oriented (OO). Senyum tak lepas dari bibirku sejak menerima informasi itu.

“Untuk itu, kamu dianggap layak untuk mengerjakan proyek yang lebih besar,” tambah Senja. Aku sampai lupa, di sini kalau dianggap performanya baik, hadiahnya berupa pekerjaan dengan tanggung jawab lebih. Memang benar kata orang bijak, semakin tinggi pohon tumbuh, semakin tinggi angin menerpa.

“Apa, Nja?”

“Praktik uji konsep OOP,” jawab Senja mantap sembari memberikan soal studi kasus padaku.

Studi Kasus dari Senja

Di perusahaan ini, seorang analis data yang masuk umumnya berusia 21, memiliki pendapatan senilai 6.500.000 dan insentif lembur senilai 100.000. Kemudian, untuk seorang ilmuwan data yang masuk umumnya berusia 25, memiliki pendapatan senilai 12.000.000, dan insentif lembur senilai 150.000. Di sisi lain, untuk tenaga lepas, hanya terdapat pendapatan umum senilai 4.000.000 untuk pembersih data dan 2.500.000 untuk dokumenter teknis.

image

image

image

https://codeshare.io/oQDnDM

Hasil Belajarku

Wah senangnya! Aku telah berhasil menyelesaikan rangkaian pelajaran Python for Data Professional Beginner. Dari materi yang telah aku pelajari dan praktekkan, aku telah mempelajari:

  • Konsep Object Oriented Programming (OOP) pada Python.
  • Teknik Class dan Objects, serta Class Behavior pada Python.
  • Teknik Encapsulation dan Inheritance dalam pemograman OOP dengan Python.
  • Teknik Polymorphism dan teknik Overloading dalam pemograman OOP pada Python.
  • Teknik membuat program OOP pada Python untuk kasus bisnis sederhana

Journey Belajar

image

image