Class Object Attributes & Instance Attributes
Setelah memahami konsep class dan object, kita akan mempelajari bagaimana sebuah class menyimpan data.
Dalam Python, attribute pada class dapat dibedakan menjadi dua konsep utama:
- Class Object Attribute
- Instance Attribute
Perbedaan keduanya penting karena menentukan apakah sebuah attribute dimiliki oleh class secara umum atau dimiliki secara khusus oleh setiap object.
Class Object Attribute
Class Object Attribute adalah attribute yang dimiliki oleh class dan nilainya secara umum berlaku untuk semua object yang dibuat dari class tersebut.
Attribute ini biasanya digunakan untuk menyimpan data yang bersifat umum atau sama untuk seluruh object.
Contohnya:
class PlayerCharacter:
membership = True
Pada contoh tersebut, membership merupakan Class Object Attribute.
Karena attribute tersebut didefinisikan langsung di dalam class, nilainya dapat digunakan oleh object yang dibuat dari class tersebut.
Instance Attribute
Instance Attribute adalah attribute yang dimiliki oleh masing-masing object.
Nilainya dapat berbeda antara satu object dengan object lainnya.
Instance attribute biasanya dibuat di dalam method __init__ menggunakan self.
Contoh:
class PlayerCharacter:
membership = True
def __init__(self, name, age):
self.name = name
self.age = age
Pada contoh tersebut:
membershipadalah Class Object Attribute.self.nameadalah Instance Attribute.self.ageadalah Instance Attribute.
Jika kita membuat beberapa object:
player1 = PlayerCharacter("Budi", 25)
player2 = PlayerCharacter("Andi", 30)
Maka secara konsep:
PlayerCharacter
│
├── membership = True
│
├── player1
│ ├── name = "Budi"
│ └── age = 25
│
└── player2
├── name = "Andi"
└── age = 30
membership bersifat umum, sedangkan name dan age dapat berbeda untuk setiap object.
Perbedaan Class Object Attribute dan Instance Attribute
Perbedaan keduanya dapat diringkas sebagai berikut:
| Attribute | Class Object Attribute | Instance Attribute |
|---|---|---|
| Dimiliki oleh | Class | Object |
| Didefinisikan | Langsung di dalam class | Biasanya di dalam __init__ |
Menggunakan self | Tidak | Ya |
| Nilai | Umumnya sama untuk semua object | Dapat berbeda setiap object |
| Contoh | membership | self.name, self.age |
Contoh Lengkap
Berikut contoh class yang memiliki kedua jenis attribute:
class PlayerCharacter:
membership = True
def __init__(self, name, age):
self.name = name
self.age = age
Kemudian kita membuat beberapa object:
player1 = PlayerCharacter("Budi", 25)
player2 = PlayerCharacter("Andi", 30)
Kita dapat mengakses instance attribute melalui object:
print(player1.name)
print(player1.age)
print(player2.name)
print(player2.age)
Output:
Budi
25
Andi
30
Sedangkan membership merupakan attribute yang berasal dari class:
print(player1.membership)
print(player2.membership)
Output:
True
True
Mengakses Class Object Attribute
Class Object Attribute dapat diakses menggunakan nama class.
Contoh:
class PlayerCharacter:
membership = True
Kita dapat mengaksesnya menggunakan:
print(PlayerCharacter.membership)
Output:
True
Class Object Attribute juga dapat diakses melalui object:
player = PlayerCharacter()
print(player.membership)
Python dapat menemukan membership pada class ketika attribute tersebut tidak ditemukan secara khusus pada object.
Mengakses Instance Attribute
Instance Attribute biasanya diakses menggunakan object.
Contoh:
class PlayerCharacter:
def __init__(self, name, age):
self.name = name
self.age = age
Kemudian:
player = PlayerCharacter("Budi", 25)
print(player.name)
print(player.age)
Output:
Budi
25
Attribute tersebut merupakan bagian dari object player.
Instance Attribute Tidak Dimiliki Class Secara Langsung
Perhatikan contoh berikut:
class PlayerCharacter:
def __init__(self, name, age):
self.name = name
self.age = age
Kemudian:
player = PlayerCharacter("Budi", 25)
name dan age merupakan attribute dari object player.
Kita tidak dapat mengaksesnya langsung melalui nama class:
print(PlayerCharacter.name)
Kode tersebut akan menghasilkan AttributeError karena name bukan attribute yang didefinisikan langsung pada class.
Attribute tersebut tersedia pada object:
print(player.name)
Peran self
self merupakan referensi ke object yang sedang digunakan.
Contohnya:
class PlayerCharacter:
def __init__(self, name, age):
self.name = name
self.age = age
Ketika kita membuat:
player1 = PlayerCharacter("Budi", 25)
Maka secara konsep:
self.name → player1.name
self.age → player1.age
Ketika membuat object lain:
player2 = PlayerCharacter("Andi", 30)
Maka:
self.name → player2.name
self.age → player2.age
Karena itu, self memungkinkan setiap object memiliki data masing-masing.
self pada Method
Selain digunakan untuk mengakses instance attribute, self juga digunakan untuk mengakses method lain yang dimiliki object.
Contoh:
class PlayerCharacter:
def __init__(self, name):
self.name = name
def greet(self):
print(f"Hello, {self.name}")
Kemudian:
player = PlayerCharacter("Budi")
player.greet()
Output:
Hello, Budi
Di dalam method greet(), self.name mengacu pada attribute name milik object yang sedang menjalankan method tersebut.
Mengapa Method Membutuhkan self?
Method yang digunakan untuk bekerja dengan instance biasanya menerima self sebagai parameter pertama.
Contoh:
class PlayerCharacter:
def greet(self):
print("Hello")
Ketika dipanggil:
player = PlayerCharacter()
player.greet()
Python secara otomatis menghubungkan object player dengan parameter self.
Secara konsep:
player.greet()
↓
greet(player)
Karena itu, self memungkinkan method mengetahui object mana yang sedang digunakan.
Attribute Lookup
Ketika kita mengakses sebuah attribute melalui object, Python akan mencari attribute tersebut.
Secara sederhana, Python akan mencari pada object terlebih dahulu.
Jika tidak ditemukan, Python kemudian dapat mencari pada class.
Contoh:
class PlayerCharacter:
membership = True
def __init__(self, name):
self.name = name
Ketika kita menjalankan:
player = PlayerCharacter("Budi")
print(player.name)
Python menemukan name pada object player.
Ketika kita menjalankan:
print(player.membership)
Python tidak menemukan membership sebagai attribute khusus pada object, sehingga Python dapat menemukannya pada class PlayerCharacter.
Secara sederhana:
player.membership
│
↓
Cek object
│
↓
Tidak ditemukan
│
↓
Cek class
│
↓
membership = True
Fungsi help()
Python menyediakan fungsi bawaan help() untuk melihat informasi mengenai sebuah object, class, function, atau tipe data.
Contohnya:
help(PlayerCharacter)
Python akan menampilkan informasi mengenai class tersebut.
Kita juga dapat melihat dokumentasi dari tipe data bawaan Python:
help(list)
Informasi yang ditampilkan dapat mencakup:
- Dokumentasi class.
- Method yang tersedia.
- Attribute tertentu.
- Dunder method.
- Informasi mengenai inheritance.
Inspeksi Object dengan help()
Misalnya kita memiliki:
class PlayerCharacter:
membership = True
def __init__(self, name, age):
self.name = name
self.age = age
Kita dapat menjalankan:
help(PlayerCharacter)
Perintah tersebut membantu kita memahami struktur class dan method yang tersedia.
Namun, perlu diperhatikan bahwa attribute instance seperti name dan age baru dibuat ketika object diinisialisasi.
Gambaran Struktur Class dan Object
Hubungan antara class, class object attribute, dan instance attribute dapat digambarkan sebagai berikut:
PlayerCharacter
│
├── Class Object Attribute
│ └── membership = True
│
├── __init__()
│
└── Object
│
├── player1
│ ├── name = "Budi"
│ └── age = 25
│
└── player2
├── name = "Andi"
└── age = 30
Class menyediakan struktur umum.
Setiap object kemudian memiliki instance attribute masing-masing.
Kesimpulan
Dalam Python, attribute pada OOP dapat digunakan untuk menyimpan data yang berkaitan dengan class maupun object.
Dua konsep utama yang perlu dipahami adalah:
- Class Object Attribute merupakan attribute yang didefinisikan pada class dan secara umum dapat digunakan oleh semua object.
- Instance Attribute merupakan attribute yang dimiliki oleh masing-masing object dan biasanya dibuat menggunakan
selfdi dalam__init__.
Contoh:
class PlayerCharacter:
membership = True
def __init__(self, name, age):
self.name = name
self.age = age
Pada contoh tersebut:
membership
↓
Class Object Attribute
↓
Berlaku secara umum
self.name
self.age
↓
Instance Attribute
↓
Spesifik untuk setiap object
Memahami perbedaan kedua jenis attribute ini sangat penting sebelum mempelajari konsep OOP berikutnya seperti method, class method, static method, encapsulation, inheritance, dan polymorphism.