Traffine I/O

Bahasa Indonesia

2023-02-25

__post_init__ dalam Dataclasses Python

Metode __post_init__ di Dataclass

Metode __post_init__ adalah fungsi khusus yang dapat ditambahkan ke Dataclass Python. Metode ini secara otomatis dipanggil setelah metode __init__, memungkinkan Anda untuk melakukan operasi tambahan, seperti validasi data, transformasi, atau pengaturan nilai default untuk atribut. Metode ini memberi Anda fleksibilitas untuk menyesuaikan instance kelas Anda tanpa harus memodifikasi metode __init__ itu sendiri.

Implementasi Dasar

Implementasi dasar dari metode __post_init__ pada data class Python melibatkan mendefinisikan metode dalam tubuh kelas dan menambahkan operasi tambahan atau penugasan atribut yang ingin Anda jalankan setelah metode __init__. Di bagian ini, saya akan membahas implementasi dasar metode __post_init__ secara langkah demi langkah.

Pertama, Anda perlu mendefinisikan data class. Data class adalah kelas Python yang menggunakan dekorator @dataclass, yang merupakan bagian dari modul dataclasses. Dekorator ini secara otomatis menghasilkan implementasi default dari metode khusus umum, seperti __init__, __repr__, dan __eq__.

python
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

Untuk mengimplementasikan metode __post_init__, Anda hanya perlu mendefinisikannya dalam tubuh kelas, hanya mengambil parameter self sebagai masukan. Parameter self adalah referensi ke instance kelas, memungkinkan Anda mengakses dan memodifikasi atribut instance.

python
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

    def __post_init__(self):
        self.name = self.name.strip().title()

Dalam contoh ini, kita telah mengimplementasikan metode __post_init__ dasar yang mengambil atribut name dan menghapus spasi di depan atau belakang menggunakan metode strip(). Kemudian, metode ini mengubah huruf pertama setiap kata dalam nama menggunakan metode title().

Sekarang, setelah Anda mengimplementasikan metode __post_init__, Anda dapat membuat instance kelas dan mengamati efek metode pada atribut kelas.

python
person1 = Person("  john doe  ", 30)
print(person1.name)  # Output: "John Doe"

person2 = Person("jane smith", 25)
print(person2.name)  # Output: "Jane Smith"

Seperti yang bisa Anda lihat, saat membuat instance dari kelas Person, metode __post_init__ secara otomatis memodifikasi atribut name, memastikan bahwa ia diformat dengan benar sesuai dengan aturan yang kita inginkan.

Dengan mengimplementasikan metode __post_init__ dengan cara ini, Anda dapat memisahkan logika untuk menginisialisasi atribut dari kelas (dilakukan oleh metode __init__) dari operasi tambahan atau modifikasi yang ingin Anda lakukan pada atribut tersebut setelah inisialisasi. Ini membantu menjaga kode yang bersih dan modular sambil tetap memungkinkan fleksbilitas dalam definisi kelas Anda.

__post_init__ dengan Parameter Opsional

Metode __post_init__ juga dapat digunakan dengan parameter opsional. Parameter ini memberikan nilai default untuk atribut yang tidak diatur selama inisialisasi objek. Ini bisa sangat berguna ketika Anda ingin memungkinkan pengguna untuk membuat instance kelas Anda tanpa menentukan semua nilai atribut. Berikut adalah contohnya:

python
from dataclasses import dataclass
from typing import Optional

@dataclass
class Product:
    name: str
    price: float
    category: str

    def __post_init__(self, discount: Optional[float] = None):
        if discount is not None:
            self.price *= (1 - discount)
        self.id = f"{self.category[:3]}_{self.name[:3]}".upper()

Dalam contoh ini, metode __post_init__ menerima parameter opsional discount. Jika nilai diberikan, harga produk akan diperbarui sesuai. Selain itu, metode ini menghasilkan ID unik untuk setiap produk, berdasarkan kategori dan nama produk.

Validasi dan Transformasi dalam __post_init__

Kasus penggunaan umum lain untuk metode __post_init__ adalah melakukan validasi dan transformasi pada atribut kelas. Ini bisa berguna untuk memastikan bahwa atribut konsisten dan mematuhi aturan bisnis tertentu. Contohnya:

python
from dataclasses import dataclass

@dataclass
class User:
    username: str
    email: str
    age: int

    def __post_init__(self):
        if self.age < 13:
            raise ValueError("Users must be at least 13 years old.")
        self.username = self.username.lower()
        self.email = self.email.lower()

Dalam contoh ini, metode __post_init__ memeriksa apakah usia pengguna kurang dari usia minimal yang diizinkan (13) dan mengeluarkan ValueError jika hal itu terjadi. Selain itu, metode ini mengubah atribut username dan email menjadi huruf kecil, memastikan bahwa semua nama pengguna dan email dalam sistem konsisten dalam formatnya.

Referensi

https://docs.python.org/3/library/dataclasses.html#post-init-processing
https://www.geeksforgeeks.org/data-classes-in-python-set-5-post-init/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!