Apa itu Classmethod
Dalam Python, classmethod
adalah dekorator bawaan yang dapat digunakan untuk mendefinisikan metode yang terkait dengan sebuah kelas dan bukan dengan instance dari kelas. Hal ini berarti bahwa classmethod dapat dipanggil pada kelas itu sendiri daripada pada instance dari kelas tersebut.
Tujuan utama dari classmethod
adalah memungkinkan kelas untuk memodifikasi atau mengakses status level kelasnya sendiri. Ini dapat berguna untuk membuat konstruktor alternatif untuk sebuah kelas, atau untuk mengimplementasikan metode pabrik yang mengembalikan instance dari kelas.
Untuk mendefinisikan classmethod
, Anda perlu menambahkan dekorator @classmethod
sebelum definisi metode. Parameter pertama dari metode harus cls
, yang merujuk pada kelas itu sendiri. Berikut adalah contohnya:
class MyClass:
class_variable = 10
@classmethod
def class_method(cls, x):
return cls.class_variable * x
result = MyClass.class_method(5)
print(result) # Output: 50
Pada contoh ini, class_variable
adalah variabel level kelas yang dapat diakses dan dimodifikasi oleh metode kelas class_method()
. class_method()
mengambil parameter x
, mengalikannya dengan class_variable
dan mengembalikan hasilnya.
Secara ringkas, classmethod
adalah alat yang kuat dalam Python yang memungkinkan Anda untuk mendefinisikan metode yang terkait dengan sebuah kelas daripada instance dari kelas tersebut. Ini biasanya digunakan untuk membuat konstruktor alternatif atau metode pabrik, dan untuk memodifikasi atau mengakses status level kelas.
Apa itu Staticmethod
Python menyediakan dekorator staticmethod
bawaan, yang memungkinkan Anda untuk menentukan metode yang terkait dengan sebuah kelas tetapi tidak memerlukan akses ke instansi atau status kelas. Mari kita lihat contoh cara menggunakan staticmethod
.
Misalkan kita memiliki kelas Person
yang mewakili seseorang dan ingin menentukan metode yang mengambil dua tanggal dan mengembalikan selisih antara keduanya dalam tahun. Metode ini tidak perlu mengakses status instansi atau kelas, sehingga metode ini cocok untuk staticmethod
.
import datetime
class Person:
def __init__(self, name, birthdate):
self.name = name
self.birthdate = birthdate
@staticmethod
def calculate_age(birthdate, today):
age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day))
return age
person1 = Person("John", datetime.date(1990, 1, 1))
today = datetime.date.today()
age = Person.calculate_age(person1.birthdate, today)
print(f"{person1.name} is {age} years old.")
Dalam contoh ini, kita menentukan metode calculate_age
sebagai staticmethod
. Metode ini mengambil dua tanggal, birthdate
dan today
, dan menghitung selisih antara keduanya dalam tahun menggunakan algoritma sederhana.
Kemudian, kita membuat objek Person
dengan nama dan tanggal lahir, dan mengambil tanggal saat ini menggunakan metode datetime.date.today()
. Kita memanggil metode calculate_age
pada kelas Person
dan memasukkan tanggal lahir objek Person dan tanggal saat ini untuk mendapatkan usia dalam tahun. Akhirnya, kita mencetak nama orang dan usia mereka.
Dengan menggunakan staticmethod
, kita dapat menentukan metode yang terkait dengan kelas Person
tetapi tidak memerlukan akses ke instansi atau status kelas. Ini membuat kode lebih terorganisir dan mudah dibaca.
Perbandingan Classmethod dan Staticmethod
Meskipun classmethod
dan staticmethod
tampak mirip pada awalnya, ada beberapa perbedaan kunci antara keduanya.
classmethod
digunakan ketika Anda ingin sebuah metode beroperasi pada kelas itu sendiri daripada pada instance kelas. classmethod
mengambil kelas sebagai argumen pertamanya, biasanya disebut cls
. Ini memungkinkan Anda untuk mengakses state-level kelas dan membuat instance kelas baru jika diperlukan.
Di sisi lain, staticmethod
digunakan ketika Anda ingin sebuah metode menjadi bagian dari kelas tetapi tidak menjadi bagian dari instance kelas tertentu. Metode ini tidak mengambil kelas sebagai argumen dan tidak memiliki akses ke state-level kelas. staticmethod
sering digunakan untuk fungsi utilitas yang berkaitan dengan kelas, tetapi tidak memerlukan akses ke state-level instance.
Berikut adalah perbandingan dari kedua metode tersebut:
- Tanda tangan
classmethod
mengambil parametercls
sebagai argumen pertama, yang mewakili kelas itu sendiri.staticmethod
tidak mengambil parameter khusus apa pun.
- Mengakses state-level kelas
classmethod
dapat mengakses state-level kelas melalui parametercls
.staticmethod
tidak dapat mengakses state-level kelas.
- Membuat instance baru
classmethod
dapat membuat instance kelas baru melalui parametercls
.staticmethod
tidak dapat membuat instance kelas baru.
- Pewarisan
classmethod
diwarisi oleh subkelas dan dapat dioverride.staticmethod
juga diwarisi oleh subkelas, tetapi tidak dapat dioverride.
Berikut adalah contoh untuk menggambarkan perbedaan keduanya:
class MyClass:
class_var = "class variable"
def __init__(self, inst_var):
self.inst_var = inst_var
@classmethod
def from_class_method(cls, inst_var):
return cls(inst_var + " (created by classmethod)")
@staticmethod
def from_static_method(inst_var):
return MyClass(inst_var + " (created by staticmethod)")
instance = MyClass("instance variable")
instance2 = MyClass.from_class_method("instance variable")
instance3 = MyClass.from_static_method("instance variable")
print(instance.class_var) # "class variable"
print(instance2.class_var) # "class variable"
print(instance3.class_var) # "class variable"
print(instance.inst_var) # "instance variable"
print(instance2.inst_var) # "instance variable (created by classmethod)"
print(instance3.inst_var) # "instance variable (created by staticmethod)"
Pada contoh ini, kita mendefinisikan MyClass
dengan class_var
dan inst_var
. Kemudian kita mendefinisikan classmethod
dan staticmethod
yang membuat instance baru dari kelas.
Ketika kita memanggil metode from_class_method
, itu membuat instance baru dari kelas dengan inst_var
yang diberikan dan mengembalikannya. Ketika kita memanggil metode from_static_method
, itu membuat instance baru dari kelas dan mengembalikannya.
Seperti yang dapat kita lihat dari output, kedua metode dapat mengakses variabel kelas, tetapi hanya classmethod yang dapat mengakses dan membuat instance baru dari kelas.
Referensi