14/11/09

Membuat kelas secara dinamis di Python

Katakanlah kita sedang membuat sebuah konstruksi bahasa sederhana berbasis Python untuk merancang sebuah daftar pertanyaan. Sebuah pertanyaan diwakilkan dengan sebuah kelas turunan dari kelas Pertanyaan dan pertanyaannya sendiri didefinisikan dalam atribut pertanyaan. Contohnya sebagai berikut.

class Nama(Pertanyaan):
    pertanyaan = "Siapa nama kamu?"

Bagi yang pernah memakai Django mungkin akan ingat dengan cara membuat kelas model untuk basis data.

Kelas Pertanyaan di atas memiliki sebuah fungsi untuk mencetak nama kelas dan isi dari atribut pertanyaan, seperti berikut.

class Pertanyaan:
    def cetak(self):
        print "Variabel  :", self.__class__.__name__
        print "Pertanyaan:", self.pertanyaan

Sehingga jika fungsi cetak() dari objek dari Nama dipanggil, akan keluar tulisan seperti berikut.

Variabel  : Nama
Pertanyaan: Siapa nama kamu?

Kode sumber sampai saat ini bisa dilihat di http://pastie.org/698881

Pendefinisian kelas secara manual, alias menulis langsung pada kode sumber, mungkin memang gampang. Namun bagaimana kalau daftar pertanyaan tidak dapat ditentukan dari awal sehingga harus membaca dari sebuah sumber tertentu, misalnya berkas daftar pertanyaan atau basis data?

Kelas-kelas pertanyaan ini ternyata dapat dibangun secara dinamis! Caranya yaitu dengan menggunakan fungsi type (referensi). Contohnya adalah seperti berikut.

kelas = type('Umur', (Pertanyaan, object, ), { 'pertanyaan': 'Berapa umurmu?' })
objek = kelas()
objek.cetak()

Keluaran yang dihasilkan adalah seperti berikut ini.

Variabel  : Umur
Pertanyaan: Berapa umurmu?

Persis sama seperti jika kita membua kelas Umur secara statis di kode sumber yang kita tulis!

Fungsi type ini selain berguna untuk mengecek tipe suatu objek, ternyata bisa digunakan juga untuk membuat sebuah tipe. Masukkan tiga buah parameter ke dalamnya untuk melakukannya.

  • Parameter 1: Nama tipe yang akan dibuat
  • Perameter 2: Daftar kelas induk dari kelas yg dibuat. Salah satu kelas induk harus merupakan turunan dari object. Kalau tidak ada, maka object harus dimasukkan ke dalam parameter 2 ini.
  • Parameter 3: Sebuah dictionary yang berisikan daftar atribut dari kelas baru ini.

Kode sumber lengkap dapat dilihat di http://pastie.org/698885.

0 komentar:

Poskan Komentar