Pada pertemuan sebelumnya kita telah membahas tentang static method, ia merupakan fungsi statis dalam sebuah kelas, yang mana proses pemanggilannya bisa langsung dipanggil dari nama kelasnya sendiri tanpa harus membuat objek terlebih dahulu.
Dan pada kesempatan kali ini kita akan membahas hal yang sangat mirip dengan static method yaitu: class method.
Apa itu class method pada python?
Class method pada python adalah method statis yang disandarkan langsung kepada sebuah kelas, artinya kita bisa memanggil fungsi tersebut tanpa harus membuat objek terlebih dahulu [1].
Class method kurang lebih sama dengan staticmethod, sama-sama statis dan sama-sama bisa dipanggil secara langsung.
Perbedaan class method dan static method
Meskipun memiliki banyak kemiripan, akan tetapi keduanya tetap saja berbeda.
Berikut ini di antara perbedaan antara class method dan static method:
- static method tidak memiliki informasi tentang kelasnya sendiri
- sedangkan class method memiliki informasi tambahan tentang kelasnya sendiri [2]
- untuk mendefinisikan static method kita menggunakan decorator
@staticmethod
, sedangkan untuk mendefinisikan class method, kita menggunakan decorator@classmethod
.
Keduanya sama-sama bisa dipanggil secara langsung:
# dari kelasnya
NamaKelas.nama_fungsi()
# atau dari objeknya
NamaKelas().nama_fungsi()
Apa pun parameter pada class method
, akan selalu ada tambahan parameter pertama yang merupakan kelasnya sendiri.
Membuat class method pada python
Untuk membuat class method pada python, kita cukup menuliskan decorator @classmethod
tepat sebelum mendefinisikan sebuah fungsi.
Perhatikan contoh berikut:
class Manusia:
jumlah_tangan = 2 # class variable
def __init__(self, nama):
self.nama = nama # instance variable
@classmethod
def pengertian(cls):
print(f'Manusia memilki {cls.jumlah_tangan} tangan')
Coba kita panggil fungsi pengertian()
:
# panggil secara langsung
Manusia.pengertian()
# panggil via objek
seseorang = Manusia('Tanpa Nama')
seseorang.pengertian()
Kita akan mendapatkan output:
Manusia memilki 2 tangan
Manusia memilki 2 tangan
Penjelasan:
- Parameter pertama dari
@classmethod
selalu merupakan kelasnya sendiri. - Misalkan class method dengan nama
pengertian()
berada dalam kelasManusia
, maka parameter pertama (yaitu parametercls
) adalah kelasMahasiswa
. - Parameter pertama tidak harus bernama
cls
, bisa bernama apa saja akan tetapi isinya tetap sama yaitu kelasnya sendiri, berbeda dengan static method yang tidak memiliki parameter tambahan apa pun kecuali parameter asli.
Kapan harus menggunakan class method?
Timbul pertanyaan: kapan seharusnya kita menggunakan class method? Kapan harus menggunakan static method? Dan kapan harusnya kita menggunakan instance method?
- Untuk fungsi-fungsi yang berkaitan secara langsung dengan instance variable, gunakan instance method.
- Untuk fungsi-fungsi yang bersifat utilitas (helper/bantuan) dan tidak berkaitan secara langsung dengan instance variable, gunakanlah static method.
- Dan untuk membuat factory method (hampir sama seperti konstruktor dengan use case berbeda), kita bisa menggunakan class method [3].
Agar tidak bingung, mari kita praktikkan secara langsung.
Membuat factory method menggunakan class method
Factory method adalah sebuah fungsi/method yang digunakan untuk membuat instan dari suatu kelas. Hampir sama seperti konstruktor, hanya saja kita bisa membuat variasi berbeda dari konstruktor yang asli.
Kita bisa memanfaatkan class method untuk membuat factory method.
Perhatikan contoh berikut:
from datetime import date
class Mahasiswa:
def __init__(self, nama, usia):
self.nama = nama
self.usia = usia
@classmethod
def berdasarkanTahunLahir(cls, nama, tahunLahir):
# hitung usia
tahunSekarang = date.today().year
usia = tahunSekarang - tahunLahir
# buat instan dengan konstruktor asli
return cls(nama, usia)
@staticmethod
def apakahSudahTua(usia):
return usia > 35
def __str__(self):
return f'{self.nama} usia {self.usia} tahun'
Sekarang kita bisa membuat instan dari kelas Mahasiswa
dengan dua cara:
- Langsung dari konstruktornya
- Lewat
@classmethod
yang bernamaberdasarkanTahunLahir()
Perhatikan contoh berikut:
# cara 1:
wahid = Mahasiswa("Wahid Abdullah", 25)
print(wahid)
# cara 2:
lendis = Mahasiswa.berdasarkanTahunLahir("Lendis Fabri", 1995)
print(lendis)
print("apakah usia 40 sudah tua?", Mahasiswa.apakahSudahTua(40))
Output:
Wahid Abdullah usia 25 tahun
Lendis Fabri usia 26 tahun
apakah usia 40 sudah tua? True
Kesimpulan
Dari contoh-contoh di atas bisa kita simpulkan bahwa:
- class method hampir sama dengan static method di mana keduanya disandarkan kepada sebuah kelas alih-alih kepada instan atau objeknya
- class method memiliki informasi tentang kelasnya sendiri sedangkan static method tidak
- class method didefinisikan dengan decorator
@classmethod
sedangkan static method menggunakan decorator@staticmethod
- class method cocok digunakan untuk factory method (seperti konstruktor akan tetapi dengan variasi berbeda)
- sedangkan static method lebih cocok digunakan untuk fungsi-fungsi utilitas yang tidak berhubungan secara langsung dengan atribut sebuah kelas
Kode Program Lengkap
Untuk kode program lengkap pada pertemuan kali ini, kalian bisa mendapatkannya di sini.
Pertemuan Selanjutnya
Pada pertemuan selanjutnya insyaallah kita akan membahas tentang method chaining pada python.
Ia merupakan teknik fungsi berantai, di mana kita bisa memanggil fungsi sebuah objek tanpa harus mengetik nama objek tersebut berkali-kali.
Bagaimana caranya?
Simak terus tutorial ini, ya! Terima kasih banyak.
Referensi
[1] https://www.programiz.com/python-programming/methods/built-in/classmethod – diakses tanggal 9 Juni 2021
[2] https://pythonbasics.org/classmethod/ – diakses tanggal 9 Juni 2021
[3] https://www.geeksforgeeks.org/class-method-vs-static-method-python/ – diakses tanggal 9 Juni 2021