(Python dan C++) Anggap saja kita sudah punya definisi class dan

Berikut ini adalah pertanyaan dari 4dministraktor pada mata pelajaran TI untuk jenjang Sekolah Menengah Atas

(Python dan C++)Anggap saja kita sudah punya definisi class dan propertinya (atribut dan method) yang diprogram dalam C++.
Bagaimana caranya menggunakan class berikut propertinya tersebut dalam kode program Python? Berikan contoh kode program dan hasil eksekusinya!

Jawaban dan Penjelasan

Berikut ini adalah pilihan jawaban terbaik dari pertanyaan diatas.

Jawaban dan Penjelasan:

Apa yang dimaksud dalam pertanyaan adalah shared library. Library yang sebelumnya dibangun dengan bahasa pemrograman C++, akan digunakan pada program atau library, pada bahasa pemrograman Python.

Ada beberapa cara, yaitu:

  • cara dasar: dengan menggunakan built-in package ctypes pada Python.
  • cara lain dan mungkin ebih mudah: dengan menggunakan package cpppy, atau pustaka Boost.Python.

Catatan:
Saya menggunakan sistem operasi Ubuntu yang berjalan pada WSL di MS Windows, dengan Python 3.10. Untuk MS Windows, akan sedikit berbeda.
_____________

Bagian I: C++

Misalkan kita sudah mempunyai kode C++ yang berisi definisi class Siswa berikut ini.

// siswa.cpp
// oleh: hy
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
class Siswa {
   private:
       const char* nomorInduk;
       const char* nama;
       // ... dan atribut lainnya
   public:
       Siswa();
       void setNomorInduk(const char* nomorInduk);
       void setNama(const char* nama);
       const char* getNomorInduk();
       const char* getNama();
       // ... dan method lainnya
};
Siswa::Siswa() {
   this->nomorInduk = (char*)"";
   this->nama = (char*)"";
}
void Siswa::setNomorInduk(const char* nomorInduk) {
   this->nomorInduk = (char*)nomorInduk;
}
void Siswa::setNama(const char* nama) {
   this->nama = (char*)nama;
}
const char* Siswa::getNomorInduk() {
   return this->nomorInduk;
}
const char* Siswa::getNama() {
   return this->nama;
}
int main() {
   Siswa s;
   s.setNomorInduk("2022.01.001");
   s.setNama("Siswadiningrat Ningratdisiswa");
   std::cout << "Nomor Induk Siswa: " << s.getNomorInduk() << std::endl;
   std::cout << "Nama Siswa: " << s.getNama() << std::endl;
   return 0;
}

Hasil eksekusi:

Nomor Induk Siswa: 2022.01.001
Nama Siswa: Siswadiningrat Ningratdisiswa
_____________

Bagian II: Ekspos C++

Package ctypes pada Python hanya mengenali C, bukan C++. Oleh karena itu, kita tambahkan kode program yang "mengekspos" C++ menjadi C dan dapat "dibaca" oleh bahasa pemrograman lain, dengan sintaks:
extern "C" {
   [isi shared library]
}

Pada file siswa.cpp di atas, kita tambahkan:
extern "C" {
   Siswa* Siswa_new() {
       return new Siswa();
   }
   void Siswa_setNomorInduk(Siswa* siswa, const char* nomorInduk) {
       siswa->setNomorInduk(nomorInduk);
   }
   void Siswa_setNama(Siswa* siswa, const char* nama) {
       siswa->setNama(nama);
   }
   const char* Siswa_getNomorInduk(Siswa* siswa) {
       return siswa->getNomorInduk();
   }
   const char* Siswa_getNama(Siswa* siswa) {
       return siswa->getNama();
   }
}

(Bisa juga disimpan dalam file lain, namun cara kompilasi akan berbeda.)

Kemudian, kita compile menjadi shared library, dengan perintah:

$ g++ -c -fPIC siswa.cpp -o siswa.o
(Jika sukses, akan terbentuk file siswa.o.)

$ g++ -shared -Wl,-soname,libsiswa.so -o libsiswa.so siswa.o
(Jika sukses, akan terbentuk file libsiswa.so.)

_____________

Bagian III: Python

Untuk menggunakan (load) shared library dalam libsiswa.so, pada bagian awal kode program Python, kita import package ctypes. Dari package ctypes, kita gunakan module cdll. Untuk memuat shared library digunakan class ctypes.CDLL, atau dengan method ctypes.cdll.LoadLibrary.

Untuk lebih jelasnya, silahkan amati kode program Python berikut ini.

# siswa.py
# oleh: hy
from ctypes import *
# Memuat shared library
lib = cdll.LoadLibrary('../cpp-wsl/libsiswa.so')
class Siswa(object):
   # Konstruktor
   def __init__(self) -> None:
       lib.Siswa_new.argtypes = [c_void_p]
       lib.Siswa_new.restype = c_void_p
       lib.Siswa_setNomorInduk.argtypes = [c_void_p, c_char_p]
       lib.Siswa_setNomorInduk.restype = c_void_p
       lib.Siswa_setNama.argtypes = [c_void_p, c_char_p]
       lib.Siswa_setNama.restype = c_void_p
       lib.Siswa_getNomorInduk.argtypes = [c_void_p]
       lib.Siswa_getNomorInduk.restype = c_char_p
       lib.Siswa_getNama.argtypes = [c_void_p]
       lib.Siswa_getNama.restype = c_char_p
       self.obj = lib.Siswa_new(None)
   # Method
   def set_nomor_induk(self, nomor_induk):
       lib.Siswa_setNomorInduk(self.obj, nomor_induk)
   def set_nama(self, nama):
       lib.Siswa_setNama(self.obj, nama)
   def get_nomor_induk(self):
       return (lib.Siswa_getNomorInduk(self.obj)).decode()
   def get_nama(self):
       return (lib.Siswa_getNama(self.obj)).decode()
### Program Utama ###
# Instansiasi objek siswa
siswa = Siswa()
# Set atribut
siswa.set_nomor_induk(b"2022.01.001")
siswa.set_nama(b"Siswadiningrat Ningratdisiswa")
# Output
print(f'Nomor Induk Siswa: {siswa.get_nomor_induk()}')
print(f'Nama Siswa: {siswa.get_nama().upper()}')

Hasil eksekusi:

Nomor Induk Siswa: 2022.01.001
Nama Siswa: SISWADININGRAT NINGRATDISISWA
_____________

Bagian IV: Penutup

Untuk membahas shared-library secara lengkap, saya pikir tidak akan cukup untuk dimuat pada jawaban ini.

Semoga dengan pertanyaan yang sudah terjawab oleh henriyulianto dapat membantu memudahkan mengerjakan soal, tugas dan PR sekolah kalian.

Apabila terdapat kesalahan dalam mengerjakan soal, silahkan koreksi jawaban dengan mengirimkan email ke yomemimo.com melalui halaman Contact

Last Update: Wed, 09 Nov 22