Classes (Kelas)

Classes (Kelas) dalam pemrograman adalah model yang digunakan merepresentasikan suatu objek di dunia nyata. Ketika kita membuat Classes, artinya kita mendefinisikan karakteristik dan perilaku objek tertentu. Membuat program atau software dengan “mengkonversi” keadaan di dunia nyata ke dalam bentuk objek dan kelas, dikenal dengan object-oriented programming. Proses membuat objek berdasarkan suatu Kelas, disebut dengan instantiation. Objeknya sendiri disebut instance. Pada materi ini, kita akan belajar bagaimana membuat Kelas, dan bekerja dengan instance dari Kelas tersebut.


Membuat Kelas

Hampir semua hal bisa dimodelkan ke dalam Kelas. Kita akan mulai dari contoh yang sederhana, yakni dengan membuat Kelas bernama Cat (kucing). Kelas Cat akan mewakili karakteristik dan perilaku kucing secara umum. Seekor kucing peliharaan memiliki nama, umur,  dan jenis kelamin. Seekor kucing juga bisa makan, tidur, dan sebagainya. Informasi tadi bersifat umum, artinya dapat dimiliki dan dilakukan oleh semua jenis kucing, sehingga bisa kita masukkan ke dalam Kelas Cat. Perhatikan cara mendefinisikan Kelas dalam bahasa Python berikut ini.

Class Cat
Contoh Membuat Kelas

Pada contoh di atas, ada beberapa highlight yang akan kita bahas. Pertama-tama, definisi Kelas dimulai dengan keyword class, diikuti dengan nama Kelas dengan huruf pertama kapital. Dalam contoh ini adalah class Cat(). Isi di bawah ruang lingkup sebuah Kelas dibuka dengan simbol titik dua :

Sebuah Kelas bisa memiliki beberapa fungsi. Semua fungsi dalam Kelas, disebut dengan method. Semua hal yang pernah kita pelajari tentang fungsi, berlaku juga pada method. Perbedaannya hanya terletak pada istilah saja. Di bawah definisi nama Kelas, kita bisa menuliskan docstring sebagai keterangan singkat mengenai Kelas tersebut. Method pertama pada contoh di atas adalah __init__(), yaitu method spesial yang otomatis dijalankan setiap kali kita membuat instance dari Kelas tersebut. Ciri khas penulisan method init() diawali dan diakhiri dengan 2 underscore berurut, dan diletakkan paling atas untuk membedakannya dengan method lain. Di sini, method init() menerima 4 parameter, yakni: self, name, age, gender. Parameter self wajib ditulis sebagai parameter pertama pada setiap pembuatan method. Setiap method dipanggil, argumen self akan otomatis di-passing, karena argumen ini merupakan referensi terhadap instance itu sendiri. Jadi, ketika kita membuat instance dari Kelas Cat, kita cukup mengirimkan argumen name, age dan gender untuk method init() yang otomatis dijalankan.

Dalam method init() terdapat 3 variable “self” yang diberi nilai, masing-masing sesuai argumen yang dikirimkan ketika pembuatan instance. Penulisan variable juga ditandai dengan “self.”, yang artinya variable tersebut dapat diakses oleh seluruh method dalam Kelas Cat tersebut. Baris perintah self.name = name berarti meng-assign nilai parameter name ke variable name yang kemudian menjadi milik dari instance yang sedang dibuat. Variable-variable “milik” instance ini dikenal dengan istilah attributes.

Kelas Cat memiliki 2 method lainnya yakni sleep() dan eat(), yang merupakan behaviour umum seekor kucing. Kedua  method tersebut tidak membutuhkan parameter apa-apa, sehingga hanya menggunakan parameter self dalam pendefinisian. Instance dari Kelas Cat akan memiliki akses terhadap kedua method ini, artinya, instance tidak hanya mempunyai nama, usia, dan jenis kelamin (attributes) saja, tapi juga bisa makan dan tidur (methods).


Membuat Instance

Kita sudah memiliki sebuah Kelas Cat di atas. Sekarang kita akan membuat instance dari Kelas tersebut. Perhatikan syntax di bawah ini.

>>> my_cat = Cat("Kitty", "2", "female")

Syntax di atas adalah instansiasi dari Kelas Cat. Variable atau objek my_cat merupakan instance dari Kelas Cat. Seperti yang sudah dijelaskan sebelumnya, ketika membuat instance, otomatis Python akan menjalankan method init() dari Kelas Cat, di mana method tersebut membutuhkan passing argumen, name, age dan gender. Itu sebabnya, pada pembuatan instance di atas, kita menyertakan 3 buah argumen sesuai parameter yang diminta. Setelah perintah tersebut di jalankan, maka my_cat akan memiliki akses terhadap semua attributes dan methods dari Kelas Cat. Artinya my_cat akan memiliki name, age, dan gender, serta dapat memanggil method eat() dan sleep(). Bagaimana cara my_cat mengakses attributes dan methods tersebut? Masih ingat dengan pembahasan tipe data String, ketika kita memanggil method? Perhatikan contoh berikut.

>>> print(my_cat.name + " is " + str(my_cat.age) + " years old " + my_cat.gender + " cat.")
Kitty is 2 years old female cat.
>>> my_cat.sleep()
Kitty is sleeping now.

Attributes dan methods diakses menggunakan nama instance, diikuti dengan nama attribute atau method, dengan dipisahkan tanda titik, sebagai berikut:

nama_instance.nama_attribute

nama_instance.nama_method

Pada contoh di atas, my_cat.name, my_cat.age, my_cat.gender adalah perintah memanggil attributes dari my_cat. Kemudian my_cat.sleep() adalah perintah memanggil method sleep(), yang isinya hanya menampilkan pesan “Kitty is sleeping now“.

Kita dapat membuat instance dari Kelas Cat di atas, sebanyak-banyaknya sesuai kebutuhan. Sebagai contoh, kita sudah mempunya instance my_cat. Kita bisa menambahkan lagi dengan nama instance baru seperti your_cat, his_cat dan seterusnya, dan mem-passing nilai argumen berbeda. Sebagai bahan latihan, cobalah buat Kelas Cat pada editor masing-masing, kemudian definisikan beberapa instance dari Kelas Cat tersebut, dan akseslah attributes maupun methods-nya.


Kelas dan Instance

Setelah Kelas selesai dibuat, program akan banyak beroperasi menggunakan instance dari Kelas tersebut. Misalnya, operasi penambahan atau pengurangan nilai attribute instance. Mengubah nilai attribute bisa dilakukan secara langsung, maupun melalui method tersendiri.

Pertama-tama kita buat Kelas yang mewakili objek Mobil, bernama Car.

Car Class
Kelas Car

Perhatikan bagian yang di-highlight berwarna kuning. Pada contoh di atas, Kelas Car memiliki 4 buah attributes, yakni Brand (brand), Model (model), tahun pembuatan (year), dan status KM (km). Kemudian Kelas Car juga memiliki 3 buah method, yakni:

  1. Method __init__() yang otomatis dijalankan ketika instance dibuat, berfungsi memberi nilai awal attributes
  2. Method get_car_desc() berfungsi menampilkan informasi (nilai attributes) mobil
  3. Method read_car_KM() berfungsi menampilkan KM mobil

Pada baris ke-21, kita membuat sebuah instance dari Kelas Car, bernama my_car. Untuk melihat info my_car yang telah dibuat, baris ke-22 memanggil method get_car_desc(). Jika program dijalankan, maka pada layar akan tampil teks Toyota Camry, 2018.

Perhatikan saat my_car didefinisikan, KM mobil tersebut masih nol (baris ke-9). Untuk mengubah attribute km dari my_car secara langsung, kita akses attribute tersebut dan beri nilai tertentu.

my_car.km = 100
my_car.read_car_KM()

Perintah pertama, attribute km diakses dan diberi nilai 100. Kemudian pada perintah ke-2, method read_car_KM() dipanggil untuk menampilkan nilai KM yang telah berubah. Buatlah Kelas Car pada editor masing-masing sesuai contoh, lalu tambahkan 2 baris perintah di atas. Kemudian jalankan program, kita akan melihat tampilan seperti di bawah ini.

Toyota Camry, 2018
This car has run 100 KM.

Setelah mencoba mengubah nilai KM my_car secara langsung, sekarang kita akan mencoba metode kedua, yakni mengubah nilai KM melalui method. Tambahkan sedikit perubahan pada kelas Car seperti contoh di bawah ini.

Car Class
Update Attribute KM

Pada program di atas, Kelas Car memiliki method baru bernama update_car_KM yang menerima parameter new_KM. Method ini berfungsi mengubah attribute km dengan nilai kilometer baru yang di-passing ketika dipanggil. Untuk mengujinya, tambahkan 2 baris perintah berikut pada program utama dan jalankan.

my_car.update_car_KM(150)
my_car.read_car_KM()

Pada perintah pertama, kita memanggil method update_car_KM() dengan argumen berupa nilai KM yang baru, yakni 150. Kemudian perintah kedua, kita membaca ulang nilai KM yang baru, dengan memanggil method read_car_KM(). Setelah perintah di atas ditambahkan dan program dijalankan ulang, output program pada baris terakhir adalah teks: This car has run 150 KM.

Contoh-contoh di atas hanyalah gambaran sederhana, bagaimana mengakses attribute dan method sebuah instance. Layaknya sebuah fungsi, perintah di dalam method dapat dibuat sekompleks dan sebanyak mungkin, sesuai dengan kebutuhan operasi terhadap instance tersbut.


Inheritance

Pada awal materi, kita sudah membahas bahwa Kelas adalah representasi dari karakteristik dan perilaku umum sebuah objek di dunia nyata. Ada kalanya, sebuah objek dapat di kategorikan lagi ke dalam kelompok yang lebih spesifik, sehingga kita perlu memodelkan kategori tersebut menjadi sebuah Kelas baru, namun tetap membawa karakteristik umum dari objek utamanya. Sebagai contoh, pada program kita mempunyai Kelas Car untuk memodelkan mobil. Kemudian program ingin dikembangkan agar bisa menangani jenis mobil listrik. Untuk memodelkannya, kita membuat Kelas lagi bernama ElectricCar, yang memiliki attribute spesifik, misalnya baterai. Karena mobil listrik tetap memiliki karakteristik sebuah mobil (Car), maka kita bisa mewarisi attribute dan method dari Kelas Car ke dalam Kelas ElectricCar. Inilahnya yang disebut dengan inheritance. Kelas Car yang mewarisi “karakteristiknya” kepada ElectricCar, disebut dengan Kelas parent, sedangkan ElectricCar yang menerima “warisan”, disebut dengan Kelas child.

Membuat Kelas Child

Ketika instance dari Kelas child dibuat, hal pertama yang dikerjakan Python interpreter adalah menjalankan method init untuk memberi nilai awal attributes pada Kelas parent. Untuk hal tersebut, method init pada Kelas child perlu memanggil method init dari Kelas parent. Baru setelahnya, attributes yang spesifik untuk Kelas child didefinisikan. Berikut ini contoh pembuatan Kelas ElectricCar yang merupakan child dari Kelas Car.

Child Class
Kelas Child ElectricCar

Perhatikan Kelas Car yang dilingkari warna biru. Karena penulis menggunakan editor Visual Studio Code, maka blok perintah “satu kelompok” (misal blok dalam satu method) bisa di-hide tampilannya seperti di atas. Tidak lain untuk menyederhanakan tampilan, karena kita akan fokus ke Kelas ElectricCar yang baru dibuat. Jika tanda panah yang di-highlight kotak kuning kita klik, isinya sama persis yakni method-method Kelas Car pada contoh sebelumnya.

Baris ke-23 sampai ke-28 adalah Kelas child bernama ElectricCar. Saat ini Kelas ElectricCar baru mempunyai satu method, yakni method init. Untuk menandakan bahwa ElectricCar adalah child dari Kelas Car, maka ketika didefinisikan, kita menuliskan nama Kelas parent-nya di dalam tanda kurung ( ), yakni (Car) – lihat baris ke-23.

Kemudian di dalam method Init milik ElectricCar, perintah pertama yang ditulis adalah memanggil method init milik Kelas parent, menggunakan keyword super, dengan disertai argumen yang sesuai (lihat baris ke-28).  Itu sebabnya, method init milik ElectricCar juga menggunakan parameter brand, model, dan year(lihat baris ke-26). Setelah memanggil method init milik parent, jika ada attributes spesifik untuk ElectricCar, maka attribute tersebut dapat didefinisikan dibawahnya. Demikian halnya dengan method-method khusus untuk ElectricCar, dapat ditambahkan di bawah method init. Pada contoh ini, belum ada attribute dan method spesifik yang ditambahkan.

Pada baris ke-31, kita membuat instance dari Kelas ElectricCar bernama my_elec_car. Proses membuat instance pada baris ini, akan otomatis menjalankan method init dalam Kelas ElectricCar, yang juga memanggil method init dari Kelas parent-nya. Kemudian baris ke-32, my_elec_car menggunakan method get_car_desc() yang mengembalikan informasi terkait merk, model dan tahun pembuatan mobil tersebut. Sebagai instance dari Kelas ElectricCar, maka my_elec_car bukan hanya memiliki akses terhadap attribute dan method dari Kelas ElectricCar saja, tetapi juga mewarisi attribute dan method dari parent ElectricCar, yakni Car.

Attribute dan Method Kelas Child

Sekarang kita akan menambahkan attribute dan method baru untuk Kelas ElectricCar. Prinsipnya sama saja seperti pada Kelas Car. Attribute dapat didefinisikan di dalam method init setelah super init dipanggil, sementara method-method baru dapat dibuat di bawah method init. Perhatikan contoh program di bawah ini.

Method Kelas Child
Attribute dan Method Kelas Child

Pada contoh, kita menambahkan sebuah attribute baru battery_status, dan dua buat method get_battery_status dan update_battery_status. Attribute dan method tersebut spesifik ditambahkan untuk Kelas ElectricCar, karena tidak semua jenis mobil memilik baterai, hanya tipe elektrik saja. Contoh penggunaan kedua method baru milik ElectricCar ada pada baris perintah ke-40 dan ke-41. Silahkan salin semua contoh program di atas dan jalankan pada editor masing-masing. Output program akan berupa teks sebagai berikut:

Tesla S, 2016
Battery is at 65 %.

Seperti yang telah dijelaskan sebelumnya, bahwa instance dari ElectricCar (Kelas child) dapat mengakses attribute dan method milik Kelas-nya sendiri dan juga milik Kelas parent-nya. Namun perlu diketahui, instance dari Car (Kelas parent), tidak bisa menggunakan attribute dan method milik Kelas child-nya. Apa yang menjadi milik parent, akan diwarisi kepada child, namun milik child tidak bisa diwarisi ke parent.

Overriding Method Kelas Parent

Walaupun Kelas child mewarisi method dari parent, namun method tersebut bisa kita buat ulang dalam Kelas child dengan nama yang sama. Kondisi ini disebut overriding. Overriding dilakukan saat fungsi method di Kelas parent kurang sesuai untuk digunakan oleh child. Untuk mencontohkan overriding ini, kita akan membuat method get_car_desc dalam Kelas ElectricCar.

Method Overriding
Contoh Overriding Method Parent

Pada contoh di atas, Kelas ElectricCar masih sama seperti sebelumnya, yakni child dari Kelas Car. Yang berbeda adalah penambahan attribute baru bernama battery_capacity. Kemudian, kita juga menambahkan method get_car_desc(), yang akan menggantikan (overriding) method get_car_desc() di Kelas Car. Method get_car_desc() milik ElectricCar tidak hanya mengembalikan info brand dan tahun pembuatan, namun juga kapasitas baterai dari mobil elektrik.

Jika program di atas dijalankan, output yang dihasilkan berupa deskripsi tentang my_elec_car beserta kapasitas baterainya seperti berikut:

Tesla S, 2016, Battery Capacity: 75 kWh

Tidak ada batasan jumlah attribute dan method yang dapat dibuat dalam sebuah Kelas, baik itu Kelas parent maupun Kelas child. Kita bisa menambahkan sebanyak yang dibutuhkan untuk memodelkan objek secara akurat. Yang perlu diperhatikan adalah, saat menggunakan konsep parentchild pada program, attribute dan method pada Kelas parent haruslah bersifat general, dan dimiliki oleh objek yang dimodelkan, secara umum. Sedangkan attribute dan method yang lebih spesifik, dibuat pada Kelas child untuk memodelkan objek turunannya.


Mengimport Kelas

Seiring pembuatan program, Kelas-Kelas yang didefinisikan bisa semakin panjang dan bervariasi. Untuk menyederhanakan dan memudahkan maintenance program, seperti halnya dengan Fungsi, Python juga memungkinkan kita menyimpan Kelas dalam file atau module terpisah. Ketika membutuhkan Kelas tersebut, kita tinggal meng-import nama module-nya. Caranya sama dengan yang telah kita pelajari pada materi Fungsi.

Mengimport Sebuah Kelas

Sejauh ini kita sudah menggunakan dua buah Kelas, yakni Kelas Car dan Electric Car. Sekarang kita akan menyimpan kedua Kelas tersebut, ke dalam file yang berbeda dengan program utama. Kita beri nama car.py. Di bawah ini adalah isi file car.py.

Module Car
Module Car

Tidak ada yang berbeda dengan baris coding kedua Kelas di atas. Semua attribute dan method-nya sama persis dengan contoh terakhir. File car.py ini selanjutnya disebut module car, sesuai dengan nama file-nya. Kita akan membuat program baru bernama my_car.py. Program ini akan menunjukkan cara meng-import sebuah Kelas dari module car yang baru saja kita buat. Perhatikan program di bawah ini.

My_Car
Contoh Import Sebuah Kelas

Pada baris pertama, program meng-import Kelas bernama Car dari module car. Syntax Python untuk meng-import sebuah module adalah:

from nama_module import nama_kelas

Setelah Kelas Car di-import, selanjutnya program bebas untuk membuat instance dari Kelas Car, kemudian mengakses attribute-attribute dan method-nya. Perhatikan betapa sederhana dan singkatnya program my_car.py, karena Kelas yang dipakai sudah “dibungkus” dalam module terpisah.

Mengimport Beberapa Kelas dari Module

Untuk meng-import beberapa Kelas dari sebuah module, kita tinggal menyebutkan nama-nama Kelas- nya, dengan dipisahkan tanda koma. Berikut syntax-nya:

from nama_module import name_kelas1, nama_kelas2, nama_kelas_selanjutnya

Perhatikan program my_car.py yang telah dimodifikasi di bawah ini.

My_Car
Contoh Import Beberapa Kelas

Perhatikan baris pertama pada contoh di atas. Kita meng-import dua buah Kelas yakni Car dan ElectricCar dari module car. Setelah di-import, program dapat membuat instance dari masing-masing Kelas (baris ke-3 dan ke-4) sesuai kebutuhan.

Mengimport Semua Kelas dari Module

Misalkan saja, module car mempunyai lebih dari 2 Kelas, katakanlah 8 buah Kelas. Apabila kita meng-import nama-nama Kelas tersebut satu per satu, tentunya baris program akan panjang dan tidak nyaman dibaca. Untuk itu, kita gunakan perintah meng-import semua Kelas dari module car. Syntax-nya adalah sebagai berikut:

from car import *

Perhatikan perubahan baris pertama, pada program my_car.py di bawah ini.

My_Car_All
Contoh Import Semua Kelas

Program di atas meng-import semua Kelas dari module car, tanpa perlu mengetahui jumlah Kelas yang dimiliki, dan menyebut nama Kelas satu per satu. Sebagai latihan, salinlah program di atas, dan panggillah method-method Kelas Car atau Electric Car lainnya.

Mengimport Module

Sebagai alternatif cara terakhir di atas, kita bisa meng-import nama module-nya saja. Jika menggunakan metode ini, maka ketika Kelas dari module tersebut diakses, kita perlu menyertakan nama module-nya. Perhatikan modifikasi program my_car.py berikut ini.

My Car Entire Module
Import Seluruh Module

Meng-import sebuah module cukup dengan keyword import diikuti dengan nama module-nya (baris pertama). Karena proses import tersebut tidak “menyertakan” Kelas, maka ketika Kelas akan digunakan, nama module-nya harus disertakan. Pada baris ke-3 dan ke-4, Kelas Car dan ElectricCar diakses dengan perintah: car.Car() dan car.ElectricCar(). Walaupun metode yang digunakan berbeda, namun proses dalam progam ini sama dengan yang sebelumnya, sehingga output yang dihasilkan juga sama.

Note: Pada dasarnya, module juga termasuk sebuah program. Karena itu, meng-import module di dalam sebuah module, dapat dilakukan.


Bagi programmer pemula, memahami konsep Kelas, Instance, Attribute dan Method memang merupakan tantangan tersendiri. Namun jika sudah menguasainya, kita akan sadar bahwa pemrograman berbasis objek ini, sangat efektif untuk memodelkan berbagai kebutuhan di dunia nyata.


Setelah mengenal Kelas dan module, selanjutnya kita akan bermain lebih jauh dengan File. Pada materi tersebut, kita akan belajar bagaimana menyimpan output program ke dalam file, sehingga dapat digunakan oleh program lainnya.


 

What do you think? Leave a Comment Below.

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Up ↑

%d bloggers like this: