📜  oop - Apa 元类 di Python (1)

📅  最后修改于: 2023-12-03 15:03:22.613000             🧑  作者: Mango

OOP - Apa itu Metakelas di Python

Metakelas adalah kelas yang digunakan untuk membuat kelas lain. Secara singkat, metakelas adalah kelas pengaturnya kelas.

Metakelas digunakan di Python sebagai mekanisme untuk mengontrol bagaimana kelas-kelas itu dibuat dan bagaimana mereka bertingkah laku.

Metakelas digunakan dalam OOP (Object-Oriented Programming) untuk memberikan banyak fitur seperti pemeriksaan kesalahan, modifikasi dinamis, pengaturan aksesibilitas, dan banyak lagi.

Python menyediakan kelas dasar yang disebut type yang merupakan metakelas bawaan. Semua kelas di Python adalah instance dari kelas ini. Oleh karena itu, untuk membuat metakelas kita perlu mewarisi kelas type.

Berikut ini adalah contoh penggunaan metakelas di Python:

class MetaKelas(type):
    def __new__(cls, name, bases, attrs):
        # melakukan modifikasi
        attrs['deskripsi'] = 'Ini adalah kelas baru'
        attrs['harga'] = 1000

        # memanggil konstruktor kelas induk
        new_class = super().__new__(cls, name, bases, attrs)

        # melakuka pemeriksaan kesalahan
        if not hasattr(new_class, 'nama_produk'):
            raise TypeError("Setiap produk harus memiliki nama.")

        return new_class

class Produk(metaclass=MetaKelas):
    nama_produk = 'Produk Baru'

Pada contoh di atas kita membuat sebuah metakelas bernama MetaKelas yang mewarisi kelas type. Metakelas ini akan memberikan deskripsi dan harga produk secara otomatis ketika sebuah kelas produk dibuat.

Kita pun dapat melakuka pemeriksaan kesalahan pada kelas produk seperti pada contoh di atas. Metakelas menjadi sangat berguna ketika kita ingin memiliki kontrol penuh pada pembuatan kelas yang kita buat.

Dalam OOP, metakelas dianggap sebagai "magis", karena mereka memungkinkan kita untuk melakukan hal-hal yang mungkin tidak mungkin dilakukan dengan OOP biasa.

Jadi, untuk menggunakan metakelas di Python, kita harus membuat sebuah kelas yang mewarisi kelas type dan kemudian menetapkan metakelas tersebut sebagai metakelas dari kelas yang ingin kita buat.