Belajar dengan membaca secara berurutan

Class dan Instance — Mendefinisikan Tipe Sendiri

Pelajari class dan instance Python dari nol. Telusuri definisi class, peran self, dan pemakaian __init__ untuk menetapkan atribut — semua dengan diagram.

Seperti yang kita singgung di rangkuman sebelumnya, tipe bawaan seperti int, str, list, dan dict tidak bisa langsung merepresentasikan konsep bisnis seperti "user," "product," atau "order." Langkah berikutnya adalah mendefinisikan tipe sendiri dengan class — itulah pintu masuk ke pemrograman berorientasi objek (OOP).

Mengapa Pemrograman Berorientasi Objek?

Semua yang kamu tulis sejauh ini bersifat prosedural — menggabungkan fungsi-fungsi untuk menggerakkan perilaku. Seiring program tumbuh, data terkait dan logika yang mengoperasikannya cenderung tersebar, dan perubahan serta pemakaian ulang menjadi lebih sulit.

Dengan pemrograman berorientasi objek (OOP), kamu membungkus data terkait (atribut) dan operasi terhadapnya (method) menjadi satu unit — sebuah objek. Itu memungkinkan kamu membentuk kode di sekitar konsep dunia nyata.

Prosedural vs OOP — Hubungan Data dan Fungsi
ProseduralData(variabel)Fungsi(di tempat lain)OOPObjekdata + methodDibungkusbersamaterpisahhasil
Pada kode prosedural, data dan fungsi hidup di tempat yang sepenuhnya terpisah, dan kamu mengoper data ke fungsi setiap kali sebagai function(data). OOP meletakkan keduanya di dalam objek sehingga hidup berdampingan.

Class Adalah Blueprint, Instance Adalah Wujud Nyata

Dua istilah menjadi pijakan semua hal di OOP:

- Class — sebuah blueprint yang mendaftarkan atribut dan method yang akan kamu miliki

- Instancewujud nyata yang dibangun dari blueprint tersebut

Misalnya, definisikan class Product untuk menangkap konsep produk, dan kamu bisa memunculkan instance produk individu sebanyak yang kamu butuhkan — apple, banana, orange. Bersama-sama, class dan instance disebut objek.

Membangun Banyak Instance dari Satu Class
Product(class)applename='apple'banananame='banana'orangename='orange'buatbuatbuat
Class itu seperti stensil — kamu tidak menggunakannya langsung. Instance yang lahir darinyalah yang sebenarnya menyimpan data dan dipanggil method-nya.

Mendefinisikan Class Minimal

Mari kita definisikan class Product untuk item di toko. Sintaksnya adalah class NamaClass:. Berdasarkan konvensi, nama class Python menggunakan CapitalizedCamelCase (Product, UserAccount, dll.).

Variabel yang ditulis langsung di dalam class — seperti name = "apple" — diperlakukan sebagai nilai default yang dimiliki class, dan kamu bisa membacanya melalui nama class sebagai Product.name.

class Product:
    name = "apple"
    price = 150

# Akses langsung lewat class
print(Product.name)    # apple
print(Product.price)   # 150
Variabel yang Menempel pada Class — Variabel Class
Product(body class)name='apple'price=150menyimpanmenyimpan
Variabel yang kamu tulis tepat di bawah classname / pricemenempel pada class itu sendiri dan bisa dibaca langsung lewat nama class sebagai Product.name.

Variabel yang ditulis langsung di bawah class disebut variabel class. Mereka berperilaku berbeda dari variabel instance (yang dimiliki masing-masing instance secara terpisah), tetapi kita akan kembali ke perbedaan itu di artikel berikutnya. Untuk sekarang, yang kamu butuhkan hanyalah ide minimal: "tempelkan nilai pada class itu sendiri, lalu baca sebagai Product.name."

Bangun class kecil untuk inventaris.

① Definisikan class Product:.

② Di dalamnya, tambahkan tiga nilai: name = "apple", price = 150, dan stock = 10.

③ Jalankan print(Product.name) / print(Product.price) / print(Product.stock) dan pastikan kamu bisa membaca setiap nilai langsung dari nama class.

(Jika kamu menjalankannya dengan benar, penjelasan akan muncul.)

Python Editor

Jalankan kode untuk melihat output

Gunakan __init__ untuk Memberi Setiap Instance Nilainya Sendiri

Class minimal di atas hanya menempelkan nilai tetap seperti name = "apple" pada class, jadi setiap instance yang kamu bangun akan menjadi "apple." Pada kode nyata, kamu ingin banyak instance dari satu class — apple, banana, orange — masing-masing dengan nilainya sendiri.

Alat untuk ini adalah method khusus Python __init__ — juga dikenal sebagai constructor atau initializer. Saat kamu memanggil Product("apple", 150) dengan argumen, Python otomatis memanggil __init__, dan di dalamnya kamu menulis self.name = name untuk menyimpan nilai pada instance itu sendiri.

Double Underscore — Konvensi Python

Nama yang dibungkus double underscore seperti __init__ disebut dunder method. Python memberi mereka makna khusus dan memanggilnya secara otomatis pada momen tertentu__init__ saat instance dibuat, __str__ saat sesuatu dicetak, dan seterusnya. Kita akan membahas __init__ lebih dalam dan menjumpai __del__ di artikel berikutnya.

Yang Terjadi Saat Kamu Memanggil Product("apple", 150)
apple = Product( 'apple', 150)__init__(self, name, price)self.name = nameself.price = priceapplename='apple', price=150panggil otomatisassignsiap
Memanggil Product("apple", 150) membuat Python ① menyiapkan instance kosong, ② mengopernya ke __init__ sebagai self, dan ③ menulis argumen ke atribut instance tersebut — meninggalkan kamu dengan objek yang sudah jadi.
class Product:
    def __init__(self, name, price):    # Dipanggil otomatis saat instance dibuat
        self.name = name
        self.price = price

apple = Product("apple", 150)
banana = Product("banana", 80)

print(apple.name, apple.price)     # apple 150
print(banana.name, banana.price)   # banana 80

# apple dan banana adalah objek berbeda
print(apple is banana)             # False
Banyak Instance dari Satu Class
Product(class)applename='apple', price=150banananame='banana', price=80orangename='orange', price=120
Setiap panggilan ke Product(...) membuat objek terpisah. apple, banana, dan orange semuanya berasal dari blueprint yang sama tetapi merupakan objek berbeda, masing-masing dengan name / price-nya sendiri.

Tulis class Product dengan __init__ dan buat banyak instance.

① Definisikan class Product:. Di dalam def __init__(self, name, price):, tulis self.name = name dan self.price = price.

② Buat dua instance: apple = Product("apple", 150) dan banana = Product("banana", 80).

③ Jalankan print(apple.name, apple.price) dan print(banana.name, banana.price) dan pastikan masing-masing membawa nilainya sendiri.

(Jika kamu menjalankannya dengan benar, penjelasan akan muncul.)

Python Editor

Jalankan kode untuk melihat output

Cara Method dan self Bekerja

Atribut saja hanya "menyimpan data" — tidak banyak berbeda dari dict biasa. Inti sebenarnya dari OOP adalah kamu juga bisa menulis operasi pada instance berdampingan dengan data. Operasi-operasi tersebut disebut method.

Aturan untuk Method dan self
class Product:def show(self): ...Param pertamaself (wajib)instance pemanggildioper otomatisself.name→ akses atributdi dalamdeklarasinilaivia
Sebuah fungsi yang ditulis di dalam class dengan def adalah method. Parameter pertama self wajib, dan pada setiap panggilan Python mengisinya dengan instance yang memanggil method tersebut. Di dalam method, tulis self.name untuk mengakses atribut instance itu.

Saat kamu menulis apple.show(), Python secara internal sedang menjalankan Product.show(apple)self akhirnya memegang apple.

self Selalu Menunjuk ke Pemanggil
Module
  • apple dan banana adalah instance terpisah
  • Saat kamu memanggil apple.show()
frame show(self)
  • self diisi dengan apple secara otomatis
  • self.name membaca apple.name
  • Untuk banana.show(), self menjadi banana
self bukan nilai tetap — ini adalah instance mana pun yang memanggil method. Dengan method show yang sama, memanggil dari apple membaca name milik apple, memanggil dari banana membaca milik banana.
class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def show(self):                         # Parameter pertama selalu self
        print(f"{self.name}: ${self.price}")

apple = Product("apple", 150)
banana = Product("banana", 80)

apple.show()    # apple: $150  secara internal sama dengan Product.show(apple)
banana.show()   # banana: $80   secara internal sama dengan Product.show(banana)
self Diputuskan Saat Method Dipanggil
apple.show()self = appleapple: $150banana.show()self = bananabanana: $80operoutputoperoutput
Memanggil apple.show() menempatkan apple ke self, sedangkan memanggil banana.show() menempatkan banana ke self. Method show yang sama berjalan dengan self berbeda setiap kali, tergantung pemanggil.

Tambahkan satu method ke Product dan panggil melalui sebuah instance.

① Definisikan class Product: dengan __init__(self, name, price) yang menetapkan self.name / self.price.

② Di dalam class, definisikan def show(self): yang mencetak f"{self.name}: ${self.price}".

③ Bangun apple = Product("apple", 150) dan banana = Product("banana", 80), lalu panggil apple.show() dan banana.show() untuk memastikan method yang sama berjalan dengan nilai masing-masing instance.

Python Editor

Jalankan kode untuk melihat output

self Hanyalah Konvensi

Secara sintaks, parameter pertama bisa apa saja — def show(this): juga bekerja. Tetapi hampir semua kode Python menggunakan self, jadi tetap pakai itu. Apa pun yang lain akan membingungkan pembaca.

Pada artikel ini kamu mendapatkan dasar pemrograman berorientasi objek. Kita akan membahas variabel dan method lebih dalam di artikel-artikel selanjutnya.

QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Mana berikut ini yang merupakan cara yang benar untuk mendefinisikan class Python?

Soal 2Apa yang dioper otomatis ke parameter pertama method self saat dipanggil?

Soal 3Apa yang dicetak oleh kode berikut?
class P:
def __init__(self, x):
self.x = x
a = P(10)
b = P(20)
print(a.x + b.x)