Modul Pembelajaran Python Pemula (Bagian 5): Pemrograman Berorientasi Objek (OOP), Manajemen File I/O, Sistem Modul, dan Proyek Akhir Terpadu
Pengantar Modul & Puncak Kurikulum Python
Selamat datang di bagian pamungkas dari Modul Pembelajaran Python Pemula. Sepanjang Bagian 1 hingga 4, Anda telah menguasai model memori CPython, logika kontrol alur, struktur data koleksi efisien, serta arsitektur fungsi dan penanganan eksepsi tingkat lanjut.
Pada Bagian 5 ini, seluruh pengetahuan tersebut akan disatukan untuk membangun arsitektur perangkat lunak modular berskala besar melalui:
- Pemrograman Berorientasi Objek (Object-Oriented Programming - OOP): Memahami Class vs. Object, konstruktor
__init__(), dan parameter self.
- Empat Pilar OOP di Python:
- Enkapsulasi: Konvensi Private/Protected, Name Mangling, serta dekorator modern
@property dan @setter.
- Pewarisan (Inheritance): Pewarisan tunggal & ganda,
super(), dan Method Resolution Order (MRO C3 Linearization).
- Polimorfisme: Duck Typing dan Operator Overloading via Dunder/Magic Methods (
__str__, __repr__, __len__, __eq__, __add__).
- Abstraksi: Modul
abc dan dekorator @abstractmethod.
- Manajemen Konteks & Berkas (File I/O Modern): Statement
with open(), manipulasi path berbasis modul pathlib, serta serialisasi format pertukaran data standar industri (JSON & CSV).
- Struktur Modul dan Package: Organisasi file
__init__.py, eksekusi if __name__ == "__main__", dan manajemen paket.
- Proyek Akhir Terpadu: Sistem Manajemen Inventaris & Transaksi Keuangan Toko Berbasis OOP, Penyimpanan File JSON/CSV, Validasi Input Robust, dan Laporan Finansial Otomatis.
======================================================================================================
ARSITEKTUR EMPAT PILAR OBJECT-ORIENTED PYTHON
======================================================================================================
+=================================================+
| ABSTRAKSI (Abstract Base Class) |
| - Mendefinisikan blueprint kontrak antarmuka |
| - Menggunakan @abstractmethod via modul abc |
+=================================================+
|
v
+=================================================+
| PEWARISAN (Inheritance) |
| - Mewarisi properti & method dari kelas induk |
| - Hirarki MRO dan pemanggilan super() |
+=================================================+
|
v
+=================================================+
| ENKAPSULASI (Encapsulation) |
| - Membatasi akses internal (_protected, __priv)|
| - Manajemen getter/setter via @property |
+=================================================+
|
v
+=================================================+
| POLIMORFISME (Polymorphism) |
| - Antarmuka seragam untuk tipe berbeda |
| - Operator Overloading & Dunder/Magic Methods |
+=================================================+
======================================================================================================
Modul 1: Fondasi Pemrograman Berorientasi Objek (OOP)
1.1 Konsep Class, Instance Objek, dan Parameter self
- Class: Cetak biru (blueprint) logis yang mendefinisikan atribut (data) dan metode (perilaku).
- Object (Instance): Wujud konkret yang dialokasikan di memori berdasarkan cetak biru class.
self: Pointer referensi eksplisit ke instance objek yang sedang memanggil metode tersebut.
<span class="token keyword">class</span> <span class="token class-name">RekeningBank</span><span class="token punctuation">:</span>
<span class="token comment"># Class Attribute (Berbagi nilai yang sama di seluruh instance)</span>
nama_bank <span class="token operator">=</span> <span class="token string">"Bank UnreliableCode Indonesia"</span>
biaya_admin_bulanan <span class="token operator">=</span> <span class="token number">6500.0</span>
<span class="token comment"># Instance Constructor</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> nomor_rekening<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> pemilik<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> saldo_awal<span class="token punctuation">:</span> <span class="token builtin">float</span> <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token comment"># Instance Attributes (Unik untuk setiap objek)</span>
self<span class="token punctuation">.</span>nomor_rekening <span class="token operator">=</span> nomor_rekening
self<span class="token punctuation">.</span>pemilik <span class="token operator">=</span> pemilik
self<span class="token punctuation">.</span>saldo <span class="token operator">=</span> saldo_awal
<span class="token comment"># Instance Method</span>
<span class="token keyword">def</span> <span class="token function">setor_tunai</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> nominal<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> nominal <span class="token operator"><=</span> <span class="token number">0</span><span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"[!] Gagal: Nominal setoran harus positif!"</span><span class="token punctuation">)</span>
<span class="token keyword">return</span>
self<span class="token punctuation">.</span>saldo <span class="token operator">+=</span> nominal
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[+] Setor Rp </span><span class="token interpolation"><span class="token punctuation">{</span>nominal<span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string"> sukses. Saldo </span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>pemilik<span class="token punctuation">}</span></span><span class="token string">: Rp </span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>saldo<span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">tarik_tunai</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> nominal<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">bool</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> nominal <span class="token operator">></span> self<span class="token punctuation">.</span>saldo<span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[!] Gagal: Saldo tidak mencukupi untuk menarik Rp </span><span class="token interpolation"><span class="token punctuation">{</span>nominal<span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string">!"</span></span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token boolean">False</span>
self<span class="token punctuation">.</span>saldo <span class="token operator">-=</span> nominal
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[+] Tarik Rp </span><span class="token interpolation"><span class="token punctuation">{</span>nominal<span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string"> sukses. Sisa saldo: Rp </span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>saldo<span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token boolean">True</span>
<span class="token comment"># Membuat Instance Objek</span>
akun_budi <span class="token operator">=</span> RekeningBank<span class="token punctuation">(</span><span class="token string">"ACC-1001"</span><span class="token punctuation">,</span> <span class="token string">"Budi Santoso"</span><span class="token punctuation">,</span> <span class="token number">10_000_000.0</span><span class="token punctuation">)</span>
akun_siti <span class="token operator">=</span> RekeningBank<span class="token punctuation">(</span><span class="token string">"ACC-1002"</span><span class="token punctuation">,</span> <span class="token string">"Siti Rahma"</span><span class="token punctuation">,</span> <span class="token number">25_000_000.0</span><span class="token punctuation">)</span>
akun_budi<span class="token punctuation">.</span>setor_tunai<span class="token punctuation">(</span><span class="token number">2_500_000.0</span><span class="token punctuation">)</span>
akun_siti<span class="token punctuation">.</span>tarik_tunai<span class="token punctuation">(</span><span class="token number">5_000_000.0</span><span class="token punctuation">)</span>
Modul 2: Empat Pilar OOP di Python
2.1 Enkapsulasi & Dekorator @property
Python tidak memiliki keyword penentu akses kaku seperti public, protected, atau private pada C++/Java. Sebaliknya, Python menggunakan konvensi penamaan berbasis garis bawah:
- Public (
self.nama): Dapat diakses bebas dari luar class.
- Protected (
self._saldo): Konvensi internal; hanya boleh diakses oleh class tersebut dan turunannya.
- Private (
self.__pin): Mengaktifkan mekanisme Name Mangling (_NamaClass__pin) untuk mencegah modifikasi atau tabrakan nama yang tidak disengaja.
<span class="token keyword">class</span> <span class="token class-name">DompetDigital</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> user_id<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> saldo_awal<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>user_id <span class="token operator">=</span> user_id
self<span class="token punctuation">.</span>_saldo <span class="token operator">=</span> <span class="token builtin">max</span><span class="token punctuation">(</span><span class="token number">0.0</span><span class="token punctuation">,</span> saldo_awal<span class="token punctuation">)</span> <span class="token comment"># Protected Attribute</span>
self<span class="token punctuation">.</span>__pin_transaksi <span class="token operator">=</span> <span class="token string">"123456"</span> <span class="token comment"># Private Attribute (Name Mangled)</span>
<span class="token comment"># 1. Getter via @property</span>
<span class="token decorator annotation punctuation">@property</span>
<span class="token keyword">def</span> <span class="token function">saldo</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">float</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''Mengambil informasi saldo secara aman.'''</span>
<span class="token keyword">return</span> self<span class="token punctuation">.</span>_saldo
<span class="token comment"># 2. Setter via @property.setter dengan Validasi Logika Bisnis</span>
<span class="token decorator annotation punctuation">@saldo<span class="token punctuation">.</span>setter</span>
<span class="token keyword">def</span> <span class="token function">saldo</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> nilai_baru<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> nilai_baru <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">:</span>
<span class="token keyword">raise</span> ValueError<span class="token punctuation">(</span><span class="token string">"Saldo dompet digital tidak boleh bernilai negatif!"</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[*] Saldo akun </span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>user_id<span class="token punctuation">}</span></span><span class="token string"> diperbarui menjadi: Rp </span><span class="token interpolation"><span class="token punctuation">{</span>nilai_baru<span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>_saldo <span class="token operator">=</span> nilai_baru
dompet_alex <span class="token operator">=</span> DompetDigital<span class="token punctuation">(</span><span class="token string">"USER-99"</span><span class="token punctuation">,</span> <span class="token number">500_000.0</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Akses Saldo via Getter: Rp </span><span class="token interpolation"><span class="token punctuation">{</span>dompet_alex<span class="token punctuation">.</span>saldo<span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
dompet_alex<span class="token punctuation">.</span>saldo <span class="token operator">=</span> <span class="token number">750_000.0</span> <span class="token comment"># Memanggil setter secara transparan!</span>
2.2 Pewarisan (Inheritance), super(), dan Method Resolution Order (MRO)
<span class="token comment"># 1. Parent Class (Superclass)</span>
<span class="token keyword">class</span> <span class="token class-name">Karyawan</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> nama<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> nik<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> gaji_pokok<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>nama <span class="token operator">=</span> nama
self<span class="token punctuation">.</span>nik <span class="token operator">=</span> nik
self<span class="token punctuation">.</span>gaji_pokok <span class="token operator">=</span> gaji_pokok
<span class="token keyword">def</span> <span class="token function">hitung_total_kompensasi</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">float</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> self<span class="token punctuation">.</span>gaji_pokok
<span class="token keyword">def</span> <span class="token function">deskripsi</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">str</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f"Karyawan: </span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>nama<span class="token punctuation">}</span></span><span class="token string"> (NIK: </span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>nik<span class="token punctuation">}</span></span><span class="token string">)"</span></span>
<span class="token comment"># 2. Child Class (Subclass) dengan Pewarisan & super()</span>
<span class="token keyword">class</span> <span class="token class-name">SoftwareEngineer</span><span class="token punctuation">(</span>Karyawan<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> nama<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> nik<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> gaji_pokok<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">,</span> tech_stack<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">[</span><span class="token builtin">str</span><span class="token punctuation">]</span><span class="token punctuation">,</span> bonus_proyek<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token comment"># Memanggil konstruktor superclass</span>
<span class="token builtin">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>__init__<span class="token punctuation">(</span>nama<span class="token punctuation">,</span> nik<span class="token punctuation">,</span> gaji_pokok<span class="token punctuation">)</span>
self<span class="token punctuation">.</span>tech_stack <span class="token operator">=</span> tech_stack
self<span class="token punctuation">.</span>bonus_proyek <span class="token operator">=</span> bonus_proyek
<span class="token comment"># Method Overriding: Menimpa metode induk</span>
<span class="token keyword">def</span> <span class="token function">hitung_total_kompensasi</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">float</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> self<span class="token punctuation">.</span>gaji_pokok <span class="token operator">+</span> self<span class="token punctuation">.</span>bonus_proyek
<span class="token keyword">def</span> <span class="token function">deskripsi</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">str</span><span class="token punctuation">:</span>
base_desc <span class="token operator">=</span> <span class="token builtin">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>deskripsi<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span>base_desc<span class="token punctuation">}</span></span><span class="token string"> | Role: Software Engineer (</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">', '</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>self<span class="token punctuation">.</span>tech_stack<span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">)"</span></span>
dev <span class="token operator">=</span> SoftwareEngineer<span class="token punctuation">(</span><span class="token string">"Alexander"</span><span class="token punctuation">,</span> <span class="token string">"ENG-001"</span><span class="token punctuation">,</span> <span class="token number">18_000_000</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">"Python"</span><span class="token punctuation">,</span> <span class="token string">"FastAPI"</span><span class="token punctuation">,</span> <span class="token string">"Docker"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">4_500_000</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dev<span class="token punctuation">.</span>deskripsi<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Total Take-Home Pay: Rp </span><span class="token interpolation"><span class="token punctuation">{</span>dev<span class="token punctuation">.</span>hitung_total_kompensasi<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
2.3 Polimorfisme & Magic / Dunder Methods (Operator Overloading)
Magic Methods (metode dengan awalan dan akhiran dua garis bawah __) memungkinkan objek kustom Anda berinteraksi secara mulus dengan sintaksis bawaan Python (len(), str(), print(), +, ==, []):
<span class="token keyword">class</span> <span class="token class-name">TitikVektor2D</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> x<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">,</span> y<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>x <span class="token operator">=</span> x
self<span class="token punctuation">.</span>y <span class="token operator">=</span> y
<span class="token comment"># Representasi String yang ramah pengguna (print / str)</span>
<span class="token keyword">def</span> <span class="token function">__str__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">str</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f"Vektor(</span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>x<span class="token punctuation">}</span></span><span class="token string">, </span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>y<span class="token punctuation">}</span></span><span class="token string">)"</span></span>
<span class="token comment"># Representasi String untuk debugging / REPL</span>
<span class="token keyword">def</span> <span class="token function">__repr__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">str</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f"TitikVektor2D(x=</span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>x<span class="token punctuation">}</span></span><span class="token string">, y=</span><span class="token interpolation"><span class="token punctuation">{</span>self<span class="token punctuation">.</span>y<span class="token punctuation">}</span></span><span class="token string">)"</span></span>
<span class="token comment"># Operator Overloading Penjumlahan: v1 + v2</span>
<span class="token keyword">def</span> <span class="token function">__add__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> other<span class="token punctuation">:</span> <span class="token string">'TitikVektor2D'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token string">'TitikVektor2D'</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> <span class="token keyword">not</span> <span class="token builtin">isinstance</span><span class="token punctuation">(</span>other<span class="token punctuation">,</span> TitikVektor2D<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> NotImplemented
<span class="token keyword">return</span> TitikVektor2D<span class="token punctuation">(</span>self<span class="token punctuation">.</span>x <span class="token operator">+</span> other<span class="token punctuation">.</span>x<span class="token punctuation">,</span> self<span class="token punctuation">.</span>y <span class="token operator">+</span> other<span class="token punctuation">.</span>y<span class="token punctuation">)</span>
<span class="token comment"># Operator Overloading Kesetaraan: v1 == v2</span>
<span class="token keyword">def</span> <span class="token function">__eq__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> other<span class="token punctuation">:</span> <span class="token builtin">object</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">bool</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> <span class="token keyword">not</span> <span class="token builtin">isinstance</span><span class="token punctuation">(</span>other<span class="token punctuation">,</span> TitikVektor2D<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> <span class="token boolean">False</span>
<span class="token keyword">return</span> self<span class="token punctuation">.</span>x <span class="token operator">==</span> other<span class="token punctuation">.</span>x <span class="token keyword">and</span> self<span class="token punctuation">.</span>y <span class="token operator">==</span> other<span class="token punctuation">.</span>y
<span class="token comment"># Panjang Vektor (Magnitudo): len(v) atau abs(v)</span>
<span class="token keyword">def</span> <span class="token function">__abs__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">float</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>self<span class="token punctuation">.</span>x <span class="token operator">**</span> <span class="token number">2</span> <span class="token operator">+</span> self<span class="token punctuation">.</span>y <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">0.5</span>
v1 <span class="token operator">=</span> TitikVektor2D<span class="token punctuation">(</span><span class="token number">3.0</span><span class="token punctuation">,</span> <span class="token number">4.0</span><span class="token punctuation">)</span>
v2 <span class="token operator">=</span> TitikVektor2D<span class="token punctuation">(</span><span class="token number">1.0</span><span class="token punctuation">,</span> <span class="token number">2.0</span><span class="token punctuation">)</span>
v3 <span class="token operator">=</span> v1 <span class="token operator">+</span> v2
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"v1 + v2 ="</span><span class="token punctuation">,</span> v3<span class="token punctuation">)</span> <span class="token comment"># Vektor(4.0, 6.0)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Panjang (abs) v1 ="</span><span class="token punctuation">,</span> <span class="token builtin">abs</span><span class="token punctuation">(</span>v1<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 5.0</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Apakah v1 == v2?"</span><span class="token punctuation">,</span> v1 <span class="token operator">==</span> v2<span class="token punctuation">)</span> <span class="token comment"># False</span>
2.4 Abstraksi: Abstract Base Classes (ABC)
<span class="token keyword">from</span> abc <span class="token keyword">import</span> ABC<span class="token punctuation">,</span> abstractmethod
<span class="token comment"># Blueprint Kontrak Gateway Pembayaran</span>
<span class="token keyword">class</span> <span class="token class-name">PaymentGateway</span><span class="token punctuation">(</span>ABC<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token decorator annotation punctuation">@abstractmethod</span>
<span class="token keyword">def</span> <span class="token function">proses_transaksi</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> order_id<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> amount<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">bool</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''Wajib diimplementasikan oleh setiap vendor pembayaran konkret.'''</span>
<span class="token keyword">pass</span>
<span class="token decorator annotation punctuation">@abstractmethod</span>
<span class="token keyword">def</span> <span class="token function">verifikasi_status</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> order_id<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">str</span><span class="token punctuation">:</span>
<span class="token keyword">pass</span>
<span class="token comment"># Implementasi Konkret: Midtrans Gateway</span>
<span class="token keyword">class</span> <span class="token class-name">MidtransPayment</span><span class="token punctuation">(</span>PaymentGateway<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">proses_transaksi</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> order_id<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> amount<span class="token punctuation">:</span> <span class="token builtin">float</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">bool</span><span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[Midtrans] Memproses transaksi #</span><span class="token interpolation"><span class="token punctuation">{</span>order_id<span class="token punctuation">}</span></span><span class="token string"> senilai Rp </span><span class="token interpolation"><span class="token punctuation">{</span>amount<span class="token punctuation">:</span><span class="token format-spec">,.2f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token boolean">True</span>
<span class="token keyword">def</span> <span class="token function">verifikasi_status</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> order_id<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">str</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> <span class="token string">"SETTLEMENT"</span>
gateway <span class="token operator">=</span> MidtransPayment<span class="token punctuation">(</span><span class="token punctuation">)</span>
gateway<span class="token punctuation">.</span>proses_transaksi<span class="token punctuation">(</span><span class="token string">"ORD-8899"</span><span class="token punctuation">,</span> <span class="token number">750000</span><span class="token punctuation">)</span>
Modul 3: Manajemen File I/O Modern & Format Pertukaran Data
3.1 Operasi File Modern dengan Statement with open() dan Modul pathlib
Penggunaan statement with (Context Manager) menjamin bahwa file handle selalu ditutup secara otomatis segera setelah blok selesai, bahkan jika terjadi error:
<span class="token keyword">from</span> pathlib <span class="token keyword">import</span> Path
<span class="token comment"># Membuat direktori kerja secara aman</span>
direktori_data <span class="token operator">=</span> Path<span class="token punctuation">(</span><span class="token string">"data_storage"</span><span class="token punctuation">)</span>
direktori_data<span class="token punctuation">.</span>mkdir<span class="token punctuation">(</span>parents<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> exist_ok<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>
file_log <span class="token operator">=</span> direktori_data <span class="token operator">/</span> <span class="token string">"audit_log.txt"</span>
<span class="token comment"># 1. Menulis Teks ke File (Mode 'w')</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>file_log<span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
f<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token string">"2026-08-29 10:00:00 [INFO] Sistem inisialisasi berhasil.\n"</span><span class="token punctuation">)</span>
f<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token string">"2026-08-29 10:05:22 [AUTH] User admin berhasil login.\n"</span><span class="token punctuation">)</span>
<span class="token comment"># 2. Menambah Teks di Akhir File / Append (Mode 'a')</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>file_log<span class="token punctuation">,</span> <span class="token string">"a"</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
f<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token string">"2026-08-29 10:15:00 [CRON] Backup database harian selesai.\n"</span><span class="token punctuation">)</span>
<span class="token comment"># 3. Membaca Baris per Baris (Memory-Efficient Reading)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\nIsi File Audit Log:"</span><span class="token punctuation">)</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>file_log<span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
<span class="token keyword">for</span> nomor_baris<span class="token punctuation">,</span> baris <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> start<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f" Baris #</span><span class="token interpolation"><span class="token punctuation">{</span>nomor_baris<span class="token punctuation">}</span></span><span class="token string">: </span><span class="token interpolation"><span class="token punctuation">{</span>baris<span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
3.2 Pertukaran Data Format JSON (json Module)
<span class="token keyword">import</span> json
data_konfigurasi <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token string">"app_name"</span><span class="token punctuation">:</span> <span class="token string">"UnreliableCode Core Service"</span><span class="token punctuation">,</span>
<span class="token string">"version"</span><span class="token punctuation">:</span> <span class="token string">"2.5.0"</span><span class="token punctuation">,</span>
<span class="token string">"port"</span><span class="token punctuation">:</span> <span class="token number">8080</span><span class="token punctuation">,</span>
<span class="token string">"features"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"auth"</span><span class="token punctuation">,</span> <span class="token string">"analytics"</span><span class="token punctuation">,</span> <span class="token string">"realtime_sync"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string">"database"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
<span class="token string">"host"</span><span class="token punctuation">:</span> <span class="token string">"localhost"</span><span class="token punctuation">,</span>
<span class="token string">"port"</span><span class="token punctuation">:</span> <span class="token number">3306</span><span class="token punctuation">,</span>
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"unreliablecode_sys"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
file_json <span class="token operator">=</span> direktori_data <span class="token operator">/</span> <span class="token string">"config.json"</span>
<span class="token comment"># 1. Serialisasi ke File JSON (dump)</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>file_json<span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
json<span class="token punctuation">.</span>dump<span class="token punctuation">(</span>data_konfigurasi<span class="token punctuation">,</span> f<span class="token punctuation">,</span> indent<span class="token operator">=</span><span class="token number">4</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[+] Konfigurasi berhasil disimpan ke </span><span class="token interpolation"><span class="token punctuation">{</span>file_json<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token comment"># 2. Deserialisasi dari File JSON (load)</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>file_json<span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
loaded_config <span class="token operator">=</span> json<span class="token punctuation">.</span>load<span class="token punctuation">(</span>f<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Loaded App Name:"</span><span class="token punctuation">,</span> loaded_config<span class="token punctuation">[</span><span class="token string">"app_name"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Loaded DB Host :"</span><span class="token punctuation">,</span> loaded_config<span class="token punctuation">[</span><span class="token string">"database"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"host"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
3.3 Pertukaran Data Format CSV (csv Module)
<span class="token keyword">import</span> csv
file_csv <span class="token operator">=</span> direktori_data <span class="token operator">/</span> <span class="token string">"laporan_karyawan.csv"</span>
<span class="token comment"># 1. Menulis CSV Berbasis DictWriter</span>
fieldnames <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"id"</span><span class="token punctuation">,</span> <span class="token string">"nama"</span><span class="token punctuation">,</span> <span class="token string">"divisi"</span><span class="token punctuation">,</span> <span class="token string">"gaji"</span><span class="token punctuation">]</span>
data_karyawan <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span><span class="token string">"id"</span><span class="token punctuation">:</span> <span class="token string">"EMP-01"</span><span class="token punctuation">,</span> <span class="token string">"nama"</span><span class="token punctuation">:</span> <span class="token string">"Budi Santoso"</span><span class="token punctuation">,</span> <span class="token string">"divisi"</span><span class="token punctuation">:</span> <span class="token string">"Backend"</span><span class="token punctuation">,</span> <span class="token string">"gaji"</span><span class="token punctuation">:</span> <span class="token number">15000000</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span><span class="token string">"id"</span><span class="token punctuation">:</span> <span class="token string">"EMP-02"</span><span class="token punctuation">,</span> <span class="token string">"nama"</span><span class="token punctuation">:</span> <span class="token string">"Siti Rahma"</span><span class="token punctuation">,</span> <span class="token string">"divisi"</span><span class="token punctuation">:</span> <span class="token string">"Frontend"</span><span class="token punctuation">,</span> <span class="token string">"gaji"</span><span class="token punctuation">:</span> <span class="token number">14000000</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span><span class="token string">"id"</span><span class="token punctuation">:</span> <span class="token string">"EMP-03"</span><span class="token punctuation">,</span> <span class="token string">"nama"</span><span class="token punctuation">:</span> <span class="token string">"Alexander"</span><span class="token punctuation">,</span> <span class="token string">"divisi"</span><span class="token punctuation">:</span> <span class="token string">"DevOps"</span><span class="token punctuation">,</span> <span class="token string">"gaji"</span><span class="token punctuation">:</span> <span class="token number">18000000</span><span class="token punctuation">}</span>
<span class="token punctuation">]</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>file_csv<span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">,</span> newline<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
writer <span class="token operator">=</span> csv<span class="token punctuation">.</span>DictWriter<span class="token punctuation">(</span>f<span class="token punctuation">,</span> fieldnames<span class="token operator">=</span>fieldnames<span class="token punctuation">)</span>
writer<span class="token punctuation">.</span>writeheader<span class="token punctuation">(</span><span class="token punctuation">)</span>
writer<span class="token punctuation">.</span>writerows<span class="token punctuation">(</span>data_karyawan<span class="token punctuation">)</span>
<span class="token comment"># 2. Membaca CSV Berbasis DictReader</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\nDaftar Karyawan dari File CSV:"</span><span class="token punctuation">)</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>file_csv<span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
reader <span class="token operator">=</span> csv<span class="token punctuation">.</span>DictReader<span class="token punctuation">(</span>f<span class="token punctuation">)</span>
<span class="token keyword">for</span> row <span class="token keyword">in</span> reader<span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f" [</span><span class="token interpolation"><span class="token punctuation">{</span>row<span class="token punctuation">[</span><span class="token string">'id'</span><span class="token punctuation">]</span><span class="token punctuation">}</span></span><span class="token string">] </span><span class="token interpolation"><span class="token punctuation">{</span>row<span class="token punctuation">[</span><span class="token string">'nama'</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token format-spec"><15</span><span class="token punctuation">}</span></span><span class="token string"> | Divisi: </span><span class="token interpolation"><span class="token punctuation">{</span>row<span class="token punctuation">[</span><span class="token string">'divisi'</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token format-spec"><10</span><span class="token punctuation">}</span></span><span class="token string"> | Gaji: Rp </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">float</span><span class="token punctuation">(</span>row<span class="token punctuation">[</span><span class="token string">'gaji'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token format-spec">>12,</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
Modul 4: Struktur Modul, Package, dan Eksekusi __main__
Ketika menulis file skrip Python, selalu sertakan konstruksi penjaga eksekusi utama:
<span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"[+] Menjalankan fungsi utama aplikasi..."</span><span class="token punctuation">)</span>
<span class="token comment"># Konstruksi Penjaga: Memastikan kode hanya berjalan jika file dieksekusi langsung</span>
<span class="token comment"># dan TIDAK BERJALAN jika file di-import sebagai modul oleh file lain!</span>
<span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>
main<span class="token punctuation">(</span><span class="token punctuation">)</span>
Modul 5: Proyek Akhir Terpadu: Sistem Manajemen Inventaris Toko & Kasir CLI
Mari kita satukan seluruh konsep dari Bagian 1 hingga Bagian 5 ke dalam sebuah aplikasi manajemen bisnis berbasis OOP, penyimpanan berkas JSON, validasi input, dan pelaporan otomatis:
<span class="token comment"># =========================================================================</span>
<span class="token comment"># PROYEK AKHIR: SISTEM MANAJEMEN INVENTARIS & KASIR TOKO TERPADU (OOP)</span>
<span class="token comment"># =========================================================================</span>
<span class="token keyword">import</span> json
<span class="token keyword">from</span> pathlib <span class="token keyword">import</span> Path
<span class="token keyword">from</span> dataclasses <span class="token keyword">import</span> dataclass<span class="token punctuation">,</span> asdict
<span class="token keyword">from</span> typing <span class="token keyword">import</span> Optional
<span class="token comment"># 1. Domain Entity: Model Produk</span>
<span class="token decorator annotation punctuation">@dataclass</span>
<span class="token keyword">class</span> <span class="token class-name">Produk</span><span class="token punctuation">:</span>
kode<span class="token punctuation">:</span> <span class="token builtin">str</span>
nama<span class="token punctuation">:</span> <span class="token builtin">str</span>
kategori<span class="token punctuation">:</span> <span class="token builtin">str</span>
harga<span class="token punctuation">:</span> <span class="token builtin">float</span>
stok<span class="token punctuation">:</span> <span class="token builtin">int</span>
<span class="token keyword">def</span> <span class="token function">kurangi_stok</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> qty<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">bool</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> qty <span class="token operator">></span> self<span class="token punctuation">.</span>stok<span class="token punctuation">:</span>
<span class="token keyword">return</span> <span class="token boolean">False</span>
self<span class="token punctuation">.</span>stok <span class="token operator">-=</span> qty
<span class="token keyword">return</span> <span class="token boolean">True</span>
<span class="token keyword">def</span> <span class="token function">tambah_stok</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> qty<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>stok <span class="token operator">+=</span> <span class="token builtin">max</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> qty<span class="token punctuation">)</span>
<span class="token comment"># 2. Service Layer: Manajemen Inventaris dengan Persistence JSON</span>
<span class="token keyword">class</span> <span class="token class-name">InventoryManager</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> storage_path<span class="token punctuation">:</span> <span class="token builtin">str</span> <span class="token operator">=</span> <span class="token string">"data_storage/inventory.json"</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>storage_path <span class="token operator">=</span> Path<span class="token punctuation">(</span>storage_path<span class="token punctuation">)</span>
self<span class="token punctuation">.</span>storage_path<span class="token punctuation">.</span>parent<span class="token punctuation">.</span>mkdir<span class="token punctuation">(</span>parents<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> exist_ok<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>produk_db<span class="token punctuation">:</span> <span class="token builtin">dict</span><span class="token punctuation">[</span><span class="token builtin">str</span><span class="token punctuation">,</span> Produk<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
self<span class="token punctuation">.</span>muat_data<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">muat_data</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> <span class="token keyword">not</span> self<span class="token punctuation">.</span>storage_path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token comment"># Seed data awal</span>
self<span class="token punctuation">.</span>produk_db <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token string">"PRD-01"</span><span class="token punctuation">:</span> Produk<span class="token punctuation">(</span><span class="token string">"PRD-01"</span><span class="token punctuation">,</span> <span class="token string">"Laptop ThinkPad"</span><span class="token punctuation">,</span> <span class="token string">"Elektronik"</span><span class="token punctuation">,</span> <span class="token number">14_500_000</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token string">"PRD-02"</span><span class="token punctuation">:</span> Produk<span class="token punctuation">(</span><span class="token string">"PRD-02"</span><span class="token punctuation">,</span> <span class="token string">"Mouse Bluetooth"</span><span class="token punctuation">,</span> <span class="token string">"Elektronik"</span><span class="token punctuation">,</span> <span class="token number">350_000</span><span class="token punctuation">,</span> <span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token string">"PRD-03"</span><span class="token punctuation">:</span> Produk<span class="token punctuation">(</span><span class="token string">"PRD-03"</span><span class="token punctuation">,</span> <span class="token string">"Buku Python Master"</span><span class="token punctuation">,</span> <span class="token string">"Buku"</span><span class="token punctuation">,</span> <span class="token number">220_000</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span>
self<span class="token punctuation">.</span>simpan_data<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">return</span>
<span class="token keyword">try</span><span class="token punctuation">:</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>storage_path<span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
raw_data <span class="token operator">=</span> json<span class="token punctuation">.</span>load<span class="token punctuation">(</span>f<span class="token punctuation">)</span>
self<span class="token punctuation">.</span>produk_db <span class="token operator">=</span> <span class="token punctuation">{</span>k<span class="token punctuation">:</span> Produk<span class="token punctuation">(</span><span class="token operator">**</span>v<span class="token punctuation">)</span> <span class="token keyword">for</span> k<span class="token punctuation">,</span> v <span class="token keyword">in</span> raw_data<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span>
<span class="token keyword">except</span> Exception <span class="token keyword">as</span> err<span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[!] Gagal membaca database inventaris: </span><span class="token interpolation"><span class="token punctuation">{</span>err<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>produk_db <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">def</span> <span class="token function">simpan_data</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>storage_path<span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
serializable <span class="token operator">=</span> <span class="token punctuation">{</span>k<span class="token punctuation">:</span> asdict<span class="token punctuation">(</span>v<span class="token punctuation">)</span> <span class="token keyword">for</span> k<span class="token punctuation">,</span> v <span class="token keyword">in</span> self<span class="token punctuation">.</span>produk_db<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span>
json<span class="token punctuation">.</span>dump<span class="token punctuation">(</span>serializable<span class="token punctuation">,</span> f<span class="token punctuation">,</span> indent<span class="token operator">=</span><span class="token number">4</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">tambah_produk</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> produk<span class="token punctuation">:</span> Produk<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>produk_db<span class="token punctuation">[</span>produk<span class="token punctuation">.</span>kode<span class="token punctuation">]</span> <span class="token operator">=</span> produk
self<span class="token punctuation">.</span>simpan_data<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[+] Produk '</span><span class="token interpolation"><span class="token punctuation">{</span>produk<span class="token punctuation">.</span>nama<span class="token punctuation">}</span></span><span class="token string">' berhasil didaftarkan ke inventaris."</span></span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">cari_produk</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> kode<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> Optional<span class="token punctuation">[</span>Produk<span class="token punctuation">]</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> self<span class="token punctuation">.</span>produk_db<span class="token punctuation">.</span>get<span class="token punctuation">(</span>kode<span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">cetak_katalog</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\n"</span> <span class="token operator">+</span> <span class="token string">"="</span> <span class="token operator">*</span> <span class="token number">70</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">'KATALOG INVENTARIS TOKO UNRELIABLECODE'</span><span class="token punctuation">:</span><span class="token format-spec">^70</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"="</span> <span class="token operator">*</span> <span class="token number">70</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">'Kode'</span><span class="token punctuation">:</span><span class="token format-spec"><8</span><span class="token punctuation">}</span></span><span class="token string"> | </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">'Nama Produk'</span><span class="token punctuation">:</span><span class="token format-spec"><25</span><span class="token punctuation">}</span></span><span class="token string"> | </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">'Kategori'</span><span class="token punctuation">:</span><span class="token format-spec"><12</span><span class="token punctuation">}</span></span><span class="token string"> | </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">'Harga'</span><span class="token punctuation">:</span><span class="token format-spec"><14</span><span class="token punctuation">}</span></span><span class="token string"> | </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">'Stok'</span><span class="token punctuation">:</span><span class="token format-spec"><5</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"-"</span> <span class="token operator">*</span> <span class="token number">70</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> p <span class="token keyword">in</span> self<span class="token punctuation">.</span>produk_db<span class="token punctuation">.</span>values<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span>p<span class="token punctuation">.</span>kode<span class="token punctuation">:</span><span class="token format-spec"><8</span><span class="token punctuation">}</span></span><span class="token string"> | </span><span class="token interpolation"><span class="token punctuation">{</span>p<span class="token punctuation">.</span>nama<span class="token punctuation">:</span><span class="token format-spec"><25</span><span class="token punctuation">}</span></span><span class="token string"> | </span><span class="token interpolation"><span class="token punctuation">{</span>p<span class="token punctuation">.</span>kategori<span class="token punctuation">:</span><span class="token format-spec"><12</span><span class="token punctuation">}</span></span><span class="token string"> | Rp </span><span class="token interpolation"><span class="token punctuation">{</span>p<span class="token punctuation">.</span>harga<span class="token punctuation">:</span><span class="token format-spec">>11,2f</span><span class="token punctuation">}</span></span><span class="token string"> | </span><span class="token interpolation"><span class="token punctuation">{</span>p<span class="token punctuation">.</span>stok<span class="token punctuation">:</span><span class="token format-spec">>4</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"="</span> <span class="token operator">*</span> <span class="token number">70</span> <span class="token operator">+</span> <span class="token string">"\n"</span><span class="token punctuation">)</span>
<span class="token comment"># 3. Pos Machine / Kasir Engine</span>
<span class="token keyword">class</span> <span class="token class-name">PosEngine</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> inventory<span class="token punctuation">:</span> InventoryManager<span class="token punctuation">)</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>inventory <span class="token operator">=</span> inventory
self<span class="token punctuation">.</span>keranjang<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">[</span><span class="token builtin">dict</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword">def</span> <span class="token function">tambah_ke_keranjang</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> kode_produk<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> qty<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">bool</span><span class="token punctuation">:</span>
produk <span class="token operator">=</span> self<span class="token punctuation">.</span>inventory<span class="token punctuation">.</span>cari_produk<span class="token punctuation">(</span>kode_produk<span class="token punctuation">)</span>
<span class="token keyword">if</span> <span class="token keyword">not</span> produk<span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[!] Produk dengan kode </span><span class="token interpolation"><span class="token punctuation">{</span>kode_produk<span class="token punctuation">}</span></span><span class="token string"> tidak ditemukan!"</span></span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token boolean">False</span>
<span class="token keyword">if</span> produk<span class="token punctuation">.</span>stok <span class="token operator"><</span> qty<span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[!] Stok tidak mencukupi! Sisa stok </span><span class="token interpolation"><span class="token punctuation">{</span>produk<span class="token punctuation">.</span>nama<span class="token punctuation">}</span></span><span class="token string">: </span><span class="token interpolation"><span class="token punctuation">{</span>produk<span class="token punctuation">.</span>stok<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token boolean">False</span>
self<span class="token punctuation">.</span>keranjang<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">"produk"</span><span class="token punctuation">:</span> produk<span class="token punctuation">,</span> <span class="token string">"qty"</span><span class="token punctuation">:</span> qty<span class="token punctuation">,</span> <span class="token string">"subtotal"</span><span class="token punctuation">:</span> produk<span class="token punctuation">.</span>harga <span class="token operator">*</span> qty<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[+] Ditambahkan ke keranjang: </span><span class="token interpolation"><span class="token punctuation">{</span>qty<span class="token punctuation">}</span></span><span class="token string">x </span><span class="token interpolation"><span class="token punctuation">{</span>produk<span class="token punctuation">.</span>nama<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token boolean">True</span>
<span class="token keyword">def</span> <span class="token function">checkout</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> <span class="token keyword">not</span> self<span class="token punctuation">.</span>keranjang<span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"[!] Keranjang belanja masih kosong."</span><span class="token punctuation">)</span>
<span class="token keyword">return</span>
total_belanja <span class="token operator">=</span> <span class="token builtin">sum</span><span class="token punctuation">(</span>item<span class="token punctuation">[</span><span class="token string">"subtotal"</span><span class="token punctuation">]</span> <span class="token keyword">for</span> item <span class="token keyword">in</span> self<span class="token punctuation">.</span>keranjang<span class="token punctuation">)</span>
<span class="token comment"># Cetak Struk Transaksi</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\n"</span> <span class="token operator">+</span> <span class="token string">"="</span> <span class="token operator">*</span> <span class="token number">55</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">'STRUK PEMBAYARAN KASIR'</span><span class="token punctuation">:</span><span class="token format-spec">^55</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"="</span> <span class="token operator">*</span> <span class="token number">55</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> item <span class="token keyword">in</span> self<span class="token punctuation">.</span>keranjang<span class="token punctuation">:</span>
p <span class="token operator">=</span> item<span class="token punctuation">[</span><span class="token string">"produk"</span><span class="token punctuation">]</span>
qty <span class="token operator">=</span> item<span class="token punctuation">[</span><span class="token string">"qty"</span><span class="token punctuation">]</span>
sub <span class="token operator">=</span> item<span class="token punctuation">[</span><span class="token string">"subtotal"</span><span class="token punctuation">]</span>
<span class="token comment"># Potong stok di inventaris</span>
p<span class="token punctuation">.</span>kurangi_stok<span class="token punctuation">(</span>qty<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f" </span><span class="token interpolation"><span class="token punctuation">{</span>p<span class="token punctuation">.</span>nama<span class="token punctuation">:</span><span class="token format-spec"><28</span><span class="token punctuation">}</span></span><span class="token string"> x</span><span class="token interpolation"><span class="token punctuation">{</span>qty<span class="token punctuation">:</span><span class="token format-spec"><2</span><span class="token punctuation">}</span></span><span class="token string"> = Rp </span><span class="token interpolation"><span class="token punctuation">{</span>sub<span class="token punctuation">:</span><span class="token format-spec">>14,2f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"-"</span> <span class="token operator">*</span> <span class="token number">55</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f" TOTAL PEMBAYARAN : Rp </span><span class="token interpolation"><span class="token punctuation">{</span>total_belanja<span class="token punctuation">:</span><span class="token format-spec">>18,2f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"="</span> <span class="token operator">*</span> <span class="token number">55</span><span class="token punctuation">)</span>
<span class="token comment"># Simpan perubahan stok ke storage</span>
self<span class="token punctuation">.</span>inventory<span class="token punctuation">.</span>simpan_data<span class="token punctuation">(</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>keranjang<span class="token punctuation">.</span>clear<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"[+] Transaksi berhasil dibukukan. Terima kasih!\n"</span><span class="token punctuation">)</span>
<span class="token comment"># 4. Demonstrasi Eksekusi Proyek</span>
<span class="token keyword">def</span> <span class="token function">jalankan_demo_proyek</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
manager <span class="token operator">=</span> InventoryManager<span class="token punctuation">(</span><span class="token string">"data_storage/inventory.json"</span><span class="token punctuation">)</span>
manager<span class="token punctuation">.</span>cetak_katalog<span class="token punctuation">(</span><span class="token punctuation">)</span>
kasir <span class="token operator">=</span> PosEngine<span class="token punctuation">(</span>manager<span class="token punctuation">)</span>
kasir<span class="token punctuation">.</span>tambah_ke_keranjang<span class="token punctuation">(</span><span class="token string">"PRD-01"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
kasir<span class="token punctuation">.</span>tambah_ke_keranjang<span class="token punctuation">(</span><span class="token string">"PRD-02"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span>
kasir<span class="token punctuation">.</span>checkout<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment"># Cetak ulang katalog untuk melihat pembaruan stok otomatis</span>
manager<span class="token punctuation">.</span>cetak_katalog<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>
<span class="token comment"># jalankan_demo_proyek()</span>
<span class="token keyword">pass</span>
Rangkuman Penutup Kurikulum Python Pemula (Bagian 1 - 5)
Selamat! Anda telah menyelesaikan seluruh 5 Bagian Modul Pembelajaran Python Pemula:
- Bagian 1: Menguasai arsitektur virtual machine CPython, model memori pointer referensi, tipe data primitif, f-strings, dan sistem operator.
- Bagian 2: Menguasai kontrol alur percabangan (early return), perulangan
while & for, loop else clause, serta Structural Pattern Matching (match...case).
- Bagian 3: Menguasai struktur data koleksi (List, Tuple, Set, Dict), optimasi kompleksitas algoritma $O(1)$, Shallow vs. Deep Copy, dan Comprehensions.
- Bagian 4: Menguasai arsitektur fungsi First-Class Citizens, Type Hints, Scope LEGB, Closures, Decorators, dan penanganan eksepsi tingkat industri.
- Bagian 5: Menguasai empat pilar Object-Oriented Programming (OOP), Magic/Dunder Methods, manajemen file I/O (pathlib, JSON, CSV), dan rekayasa proyek aplikasi terpadu.
Dengan menyelesaikan seluruh modul ini, Anda telah memiliki landasan rekayasa perangkat lunak Python yang solid, modern, dan siap melangkah ke ranah lanjutan seperti Backend Web Development (FastAPI/Django), Asynchronous Programming (asyncio), Data Engineering, atau Reverse Engineering.
Teruslah berlatih, bangun portofolio proyek nyata, dan jadilah engineer yang tangguh!
Modul disusun dan diverifikasi secara komprehensif oleh Tim Rekayasa Perangkat Lunak UnreliableCode untuk unreliablecode.net