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__
.
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.
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.
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:
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:
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