Python for data professional Part 3
- Name
- Halipuddin
- @halip26
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?
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.
- Encapsulation: Menyembunyikan sebagian detail yang dimiliki oleh sebuah objek terhadap objek-objek lainnya.
- Inheritance: Menurunkan serangkaian fungsi-fungsi yang dimiliki oleh sebuah objek ke sebuah objek baru tanpa mengubah makna dari objek acuan yang digunakan.
- Polymorphism: Konsep untuk menggunakan fungsi-fungsi dengan nama/tujuan yang sama dengan cara yang berbeda.
Quiz
Quiz
Quiz
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.
Kemudian, dari class yang telah aku definisikan, aku dapat menciptakan objek (Diriku dan Senja) dari sebuah class dengan menggunakan syntax berikut.
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.
- Class Attribute adalah properti/atribut yang bernilai sama untuk oleh seluruh objek
- 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
Menggunakan potongan kode di atas, nama_perusahaan sebagai class attribute dapat kita akses dengan menggunakan syntax:
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:
Tugas: Aku di minta untuk mengerjakan tutorial sederhana untuk membantu memahami konsep OOP:
- Definisikan Class Karyawan
- Inisiasi object yang dinyatakan dalam variabel Aksara dan Senja
- Cetak Nama Perusahaan melalui penggunaan keyword class
- Ubah Nama Perusahaan menjadi 'DEF'
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:
Selanjutnya, untuk merepresentasikan instance attribute milik Senja, aku mengetik potongan kode berikut pada live code editor:
Quiz
Quiz
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
untuk menambahkan pendapatan lembur diriku, aku dapat menggunakan fungsi lembur() pada objek aksara.
untuk menambahkan pendapatan tambahan proyek pada senja, aku dapat mengakses fungsi tambahan_proyek() pada objek senja
Selanjutnya, aku dapat menghitung total pendapatanku dan Senja
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)
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.
Tugas Praktek
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,
Aku dapat mengakses setiap atribut milik class Karyawan secara langsung di luar scope milik class Karyawan. Sebagai contoh,
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.
- 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
- 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:
Pada potongan kode di atas, atribut nama_perusahaan bersifat publicyang mengartikan bahwa aku dapat mengakses atribut ini di luar scope class Karyawan
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,
akan menyebabkan error yang menyatakan bahwa objek Karyawan tidak memiliki atribut __nama.
Quiz
Quiz
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:
melakukan inheritance (menurunkan seluruh atribut dan fungsi dari class Karyawan) ke class AnalisData
objek AnalisData dapat mengakses fungsi lembur milik class Karyawan
Selanjutnya,
objek IlmuwanData dapat mengakses fungsi tambahan_proyek milik class Karyawan
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().
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
Fungsi lembur pada objek aksara sebagai bagian dari class AnalisData akan menambahkan total_pendapatan milik objek sebesar 250000 mengikuti insentif_lembur milik class Karyawan
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
Quiz
Quiz
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
Aku melakukan pemanggilan konstruktur class Karyawan, menerapkan polymorphism dengan mendefinisikan kembali fungsi lembur() pada AnalisData, dan menambahkan 10% tambahan pendapatan pada class AnalisData
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
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:
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.
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.
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
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.