Pendahuluan — dari mental model ke sintaks

Di Mengenal OOP (#40) kamu sudah punya cara berpikir: class = cetakan, object = barang konkret. Artikel ini mengubah itu menjadi kode Python yang bisa dijalankan.

Fokus hari ini sempit dan tajam: menulis class Buku, membuat beberapa instance, dan melihat bahwa tiap object punya identitas sendiri.

Prasyarat: Selesai #40 (atau setidaknya paham beda class vs object). Python 3.11+ sudah terpasang (python --version).

Syntax class paling sederhana

Keyword class diikuti nama dalam PascalCase (huruf besar di tiap kata). Tubuh class diindentasi seperti fungsi:

class Buku:
    pass  # sementara kosong — class valid, belum punya perilaku

pass artinya “belum ada isi”. Berguna saat kamu masih merancang struktur. Untuk produksi, kita segera isi attribute dan method.

Class dengan attribute di dalam __init__

Hampir semua class nyata punya __init__: method khusus yang dipanggil otomatis saat object dibuat. Parameter pertama selalu self — merujuk ke instance yang sedang dibuat.

class Buku:
    def __init__(self, judul, penulis, tahun):
        self.judul = judul
        self.penulis = penulis
        self.tahun = tahun

Penjelasan singkat:

  • self.judul = judul — simpan nilai parameter ke attribute milik object ini
  • Nama di kiri (self.judul) boleh sama dengan parameter; yang penting adalah self.

Detail dalam __init__, method lain, dan error “lupa self” akan dibahas lebih dalam di artikel Attribute & Method berikutnya. Hari ini cukup bisa membuat object.

Membuat object (instance)

Panggil nama class seperti memanggil fungsi — Python menjalankan __init__:

buku_a = Buku("Belajar Python", "Sari", 2024)
buku_b = Buku("ESP32 Praktis", "Budi", 2023)

print(buku_a.judul)   # Belajar Python
print(buku_b.judul)   # ESP32 Praktis
print(buku_a.penulis) # Sari
print(buku_b.tahun)   # 2023

buku_a dan buku_b memakai cetakan yang sama, tetapi datanya berbeda. Mengubah satu tidak mengubah yang lain:

buku_a.tahun = 2025
print(buku_a.tahun)  # 2025
print(buku_b.tahun)  # 2023 — tidak ikut berubah

Diagram: satu class, banyak object

class Buku __init__(judul, penulis, tahun) self.judul / penulis / tahun cetakan bersama buku_a Belajar Python · Sari · 2024 instance #1 buku_b ESP32 Praktis · Budi · 2023 instance #2 Buku(...) Buku(...)
Pemanggilan Buku(...) menghasilkan object baru di memori.

Identitas object: id() dan is

Selain isinya (judul, tahun), tiap object punya identitas di memori. Fungsi bawaan id() menampilkan angka unik (implementasi CPython: alamat memori):

buku_a = Buku("Belajar Python", "Sari", 2024)
buku_b = Buku("Belajar Python", "Sari", 2024)  # isi sama!

print(id(buku_a))
print(id(buku_b))
print(buku_a is buku_b)  # False — dua object berbeda
print(buku_a.judul == buku_b.judul)  # True — nilainya sama

Operator is membandingkan identitas (object yang sama di memori). Operator == membandingkan nilai — tapi hati-hati: untuk class buatanmu sendiri, defaultnya buku_a == buku_b masih False (mirip is) sampai kita tulis __eq__ nanti. Makanya contoh di atas membandingkan buku_a.judul == buku_b.judul, bukan kedua object-nya.

Untuk pemula: ingat dulu bahwa dua pemanggilan Buku(...) = dua object, meski argumennya identik.

Method sederhana: perilaku milik object

Attribute menyimpan data; method adalah fungsi di dalam class yang bekerja pada data itu:

class Buku:
    def __init__(self, judul, penulis, tahun):
        self.judul = judul
        self.penulis = penulis
        self.tahun = tahun

    def info(self):
        return f"{self.judul} oleh {self.penulis} ({self.tahun})"

buku_a = Buku("Belajar Python", "Sari", 2024)
print(buku_a.info())
# Belajar Python oleh Sari (2024)

Saat menulis buku_a.info(), Python mengirim buku_a sebagai self secara otomatis. Itulah kenapa method selalu punya parameter self di definisi.

Kode lengkap — salin & jalankan

Gabungan singkat dari bagian di atas. Simpan sebagai buku.py, lalu jalankan python buku.py:

class Buku:
    def __init__(self, judul, penulis, tahun):
        self.judul = judul
        self.penulis = penulis
        self.tahun = tahun

    def info(self):
        return f"{self.judul} oleh {self.penulis} ({self.tahun})"


buku_a = Buku("Belajar Python", "Sari", 2024)
buku_b = Buku("ESP32 Praktis", "Budi", 2023)

print(buku_a.info())
print(buku_b.info())
print("id berbeda?", id(buku_a) != id(buku_b))
print("object yang sama?", buku_a is buku_b)

Pola Dasar — langkah membuat class pertama

  1. 1
    Tulis class Nama Pakai PascalCase: class Buku:
  2. 2
    Isi __init__ + self Terima data, simpan ke self.atribut.
  3. 3
    Buat instance obj = Buku(...) — boleh berkali-kali.
  4. 4
    Pakai attribute / method obj.judul, obj.info() — data dan perilaku lewat object yang sama.
Ringkas: class → __init__ → instance → pakai.

Kesalahan umum pemula

Gejala Penyebab tipikal Perbaikan
TypeError: Buku.__init__() missing ... required positional argument Memanggil Buku() tanpa argumen, padahal __init__ meminta data Isi semua parameter: Buku("Judul", "Penulis", 2024)
TypeError: ... missing 1 required positional argument: 'self' Memanggil method lewat class tanpa instance, atau lupa self di definisi Pakai buku_a.info(); pastikan def info(self):
AttributeError: 'Buku' object has no attribute 'judul' Belum di-set di __init__, atau typo nama Cek self.judul = judul
Dua variabel “terasa sama” tapi is False Dua instance berbeda meski isinya mirip Normal — bandingkan nilai attribute, bukan identitas, kecuali memang butuh object yang sama

Latihan singkat

  1. Buat class Anggota dengan nama dan id_anggota. Buat dua instance, cetak attribute-nya.
  2. Tambahkan method sapa(self) yang mengembalikan string "Halo, {nama}".
  3. Buat dua Buku dengan judul sama. Bandingkan id(), is, dan == pada attribute judul.

FAQ singkat

Apakah wajib pakai __init__?
Tidak wajib secara sintaks, tapi hampir selalu kamu butuh. Tanpa __init__, attribute harus di-set manual setelah object dibuat — mudah lupa.

Kenapa nama class PascalCase?
Konvensi PEP 8 agar mudah dibedakan dari fungsi/variabel (snake_case).

Berapa banyak object yang boleh dibuat?
Sebanyak yang dibutuhkan program (dan memori komputer). Class tidak membatasi jumlah instance.

Kesimpulan & langkah berikutnya

Class adalah cetakan; object adalah hasil NamaClass(...). Tiap instance punya attribute sendiri dan identitas sendiri (id / is). Method memberi perilaku yang melekat pada object lewat self.

Artikel ini adalah #41 (ini) — langkah kedua Seri 3 setelah Mengenal OOP (#40). Kamu sudah bisa menulis class, membuat beberapa object, dan membedakan isi vs identitas.

Lanjut ke artikel berikutnya — Attribute, Method, dan Constructor __init__: kita bedah self lebih dalam, method yang mengubah state, dan kesalahan klasik saat parameter tertukar. (Belum di-hyperlink sampai artikel itu live.)

Seri 3 progress: 2/10 artikel (setelah #41 live). Prasyarat: Mengenal OOP (#40).