
Method Overriding dan Overloading di Python
Method overriding dan overloading adalah dua teknik penting dalam OOP untuk membuat method lebih fleksibel dan sesuai kebutuhan.
Static method dan class method adalah dua jenis method khusus di Python yang sering digunakan dalam OOP. Keduanya punya peran berbeda dari method biasa, dan seringkali membingungkan bagi pemula. Pada artikel ini, kita akan membahas secara mendalam tentang static method dan class method, perbedaannya dengan method biasa, kapan harus menggunakannya, serta berbagai contoh dan studi kasus nyata agar kamu benar-benar paham.
Sebelum membahas static method dan class method, mari kita pahami dulu apa itu method biasa (instance method).
self
, yaitu referensi ke object (instance) yang memanggil method tersebut. Instance method bisa mengakses dan mengubah data object.cls
, yaitu referensi ke class, bukan object. Cocok untuk operasi yang berkaitan dengan class, bukan data object tertentu.self
maupun cls
. Static method tidak bergantung pada object atau class, tapi tetap didefinisikan di dalam class.Tabel ringkas perbedaannya:
Jenis Method | Parameter Pertama | Bisa akses data object? | Bisa akses data class? | Kapan digunakan? |
---|---|---|---|---|
Instance Method | self | Ya | Ya (via self.class) | Operasi pada object |
Class Method | cls | Tidak | Ya | Operasi pada class, factory |
Static Method | - | Tidak | Tidak | Utility/helper, validasi, dll |
Static method adalah method yang tidak bergantung pada object maupun class. Static method tidak menerima parameter self
atau cls
. Biasanya digunakan untuk fungsi utilitas yang masih berhubungan dengan class, tapi tidak perlu mengakses data object atau class.
Gunakan dekorator @staticmethod
di atas method.
class Matematika:
@staticmethod
def tambah(a, b):
return a + b
class Matematika:
@staticmethod
def tambah(a, b):
return a + b
print(Matematika.tambah(3, 4))
7
Penjelasan:
@staticmethod
digunakan untuk mendekorasi method.Kenapa tidak buat fungsi di luar class saja? Static method tetap didefinisikan di dalam class agar secara logika masih “berhubungan” dengan class tersebut. Ini membuat struktur kode lebih rapi dan mudah dipahami.
Contoh:
class StringUtil:
@staticmethod
def is_palindrome(text):
return text == text[::-1]
print(StringUtil.is_palindrome("katak")) # True
Class method adalah method yang menerima parameter cls
(class itu sendiri), bukan self
(object). Cocok untuk membuat object baru (factory method), mengakses/mengubah data class (bukan data object), atau operasi yang berkaitan dengan class secara umum.
Gunakan dekorator @classmethod
di atas method.
class Mahasiswa:
jumlah = 0
@classmethod
def total_mahasiswa(cls):
return cls.jumlah
class Mahasiswa:
jumlah = 0
def __init__(self, nama):
self.nama = nama
Mahasiswa.jumlah += 1
@classmethod
def total_mahasiswa(cls):
return cls.jumlah
m1 = Mahasiswa("Budi")
m2 = Mahasiswa("Ani")
print(Mahasiswa.total_mahasiswa())
2
Penjelasan:
@classmethod
digunakan untuk mendekorasi method.cls.jumlah
).Factory method adalah method yang digunakan untuk membuat object dengan cara khusus.
class Buku:
def __init__(self, judul, penulis):
self.judul = judul
self.penulis = penulis
@classmethod
def dari_string(cls, data):
judul, penulis = data.split("-")
return cls(judul.strip(), penulis.strip())
b1 = Buku.dari_string("Belajar Python - Maslul")
print(b1.judul)
print(b1.penulis)
Belajar Python
Maslul
Penjelasan:
dari_string
adalah class method yang membuat object dari string.cls
digunakan untuk membuat object baru dari class.Mari kita lihat contoh nyata penggunaan static method dan class method dalam aplikasi sederhana.
Misal, kamu ingin membuat class User
yang hanya menerima email valid.
class User:
def __init__(self, email):
if not self.valid_email(email):
raise ValueError("Email tidak valid")
self.email = email
@staticmethod
def valid_email(email):
return "@" in email and "." in email
try:
u = User("[email protected]")
print("User dibuat:", u.email)
u2 = User("salah-email")
except ValueError as e:
print(e)
User dibuat: [email protected]
Email tidak valid
Penjelasan:
valid_email
digunakan untuk validasi, tidak butuh akses ke object/class.class Produk:
total_produk = 0
def __init__(self, nama):
self.nama = nama
Produk.total_produk += 1
@classmethod
def info_total(cls):
print(f"Total produk: {cls.total_produk}")
p1 = Produk("Laptop")
p2 = Produk("Mouse")
Produk.info_total()
Total produk: 2
Penjelasan:
info_total
mengakses data class, bukan data object.class Mahasiswa:
def __init__(self, nama, nim):
self.nama = nama
self.nim = nim
@classmethod
def dari_dict(cls, data):
return cls(data["nama"], data["nim"])
@classmethod
def dari_string(cls, data):
nama, nim = data.split(",")
return cls(nama.strip(), nim.strip())
m1 = Mahasiswa.dari_dict({"nama": "Budi", "nim": "123"})
m2 = Mahasiswa.dari_string("Ani, 456")
print(m1.nama, m1.nim)
print(m2.nama, m2.nim)
Budi 123
Ani 456
class Demo:
def instance_method(self):
print("Instance method dipanggil dari object:", self)
@classmethod
def class_method(cls):
print("Class method dipanggil dari class:", cls)
@staticmethod
def static_method():
print("Static method dipanggil tanpa akses object/class")
d = Demo()
d.instance_method()
Demo.class_method()
Demo.static_method()
Instance method dipanggil dari object: <__main__.Demo object at ...>
Class method dipanggil dari class: <class '__main__.Demo'>
Static method dipanggil tanpa akses object/class
No | Tips | Penjelasan |
---|---|---|
1 | Gunakan static method untuk fungsi yang tidak butuh data object/class | Misal: validasi, konversi format |
2 | Gunakan class method untuk factory method atau operasi pada class | Misal: membuat object dari format lain |
3 | Jangan gunakan static/class method jika butuh akses data object | Pakai instance method saja |
4 | Beri nama method yang jelas sesuai fungsinya | Misal: from_json , is_valid , info_total |
5 | Dokumentasikan method dengan docstring | Agar mudah dipahami tim lain |
Q: Apa bedanya static method dan class method?
A: Static method tidak menerima parameter self
atau cls
, tidak bisa akses data object/class. Class method menerima cls
, bisa akses data class.
Q: Bisakah static/class method dipanggil dari object?
A: Ya, tapi best practice: static method/class method dipanggil dari class.
Q: Kapan harus pakai static method, bukan fungsi biasa?
A: Jika fungsi masih relevan secara logika dengan class, letakkan sebagai static method agar struktur kode lebih rapi.
Q: Bisakah static/class method diwariskan?
A: Ya, static method dan class method bisa diwariskan dan di-override di class turunan.
Q: Apa bisa mendekorasi method dengan @staticmethod dan @classmethod sekaligus?
A: Tidak bisa, pilih salah satu sesuai kebutuhan.
class Hewan:
jenis = "Hewan"
@classmethod
def info_jenis(cls):
print(f"Ini adalah class: {cls.jenis}")
@staticmethod
def suara_umum():
print("Hewan bersuara...")
class Kucing(Hewan):
jenis = "Kucing"
Kucing.info_jenis() # Output: Ini adalah class: Kucing
Kucing.suara_umum() # Output: Hewan bersuara...
Penjelasan:
@staticmethod
atau @classmethod
.self
di static/class method (akan error).Static method dan class method adalah fitur powerful di Python OOP yang membuat class lebih fleksibel dan terorganisir. Dengan memahami perbedaan dan cara penggunaannya, kamu bisa menulis kode yang lebih rapi, modular, dan mudah dirawat. Jangan ragu untuk menggunakan static method untuk fungsi utilitas, dan class method untuk operasi pada class atau factory method.
Teruslah berlatih dan eksperimen dengan berbagai kasus, agar semakin mahir menggunakan static method dan class method di Python!
Happy coding!
Method overriding dan overloading adalah dua teknik penting dalam OOP untuk membuat method lebih fleksibel dan sesuai kebutuhan.
Encapsulation (enkapsulasi) dan abstraction (abstraksi) adalah dua prinsip penting dalam OOP yang membantu menjaga keamanan dan kesederhanaan kode.
Inheritance (pewarisan) dan polymorphism (polimorfisme) adalah dua konsep utama dalam OOP yang membuat kode lebih fleksibel dan mudah dikembangkan.
Constructor dan destructor adalah dua konsep penting dalam pemrograman berorientasi objek (OOP) di Python.