Traffine I/O

Bahasa Indonesia

2023-02-24

Classmethod dan Staticmethod di Python

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:

python
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.

python
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 parameter cls 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 parameter cls.
    • staticmethod tidak dapat mengakses state-level kelas.
  • Membuat instance baru
    • classmethod dapat membuat instance kelas baru melalui parameter cls.
    • 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:

python
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

https://www.geeksforgeeks.org/class-method-vs-static-method-python/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!