Latihan: Extending List
Pada latihan ini kita akan menerapkan beberapa konsep OOP yang telah dipelajari sebelumnya, yaitu:
- Inheritance.
- Built-in class.
- Method overriding.
- Dunder methods.
isinstance().
Kita akan membuat class bernama SuperList yang mewarisi seluruh kemampuan dari built-in class list.
Selain itu, kita akan mengubah perilaku method __len__() sehingga fungsi len() selalu menghasilkan nilai 1000.
Tujuan Latihan
Kita akan membuat class:
class SuperList(list):
pass
Class SuperList merupakan child class dari list.
Artinya, SuperList akan mewarisi berbagai kemampuan yang dimiliki oleh list.
Misalnya:
- Menambahkan data dengan
append(). - Mengakses data menggunakan
[]. - Melakukan iterasi.
- Menggunakan berbagai method bawaan
list.
Namun, kita akan melakukan sedikit modifikasi terhadap perilaku len().
Persyaratan Latihan
SuperList harus memenuhi dua persyaratan utama.
1. Mewarisi Kemampuan list
SuperList harus tetap dapat menggunakan berbagai fitur bawaan list.
Contohnya:
super_list1.append(5)
dan:
super_list1[0]
2. Mengubah Perilaku len()
Ketika fungsi:
len(super_list1)
dipanggil, hasilnya harus selalu:
1000
Tidak peduli berapa banyak elemen yang sebenarnya terdapat di dalam SuperList.
Membuat SuperList
Kita dapat membuat SuperList dengan inheritance:
class SuperList(list):
def __len__(self):
return 1000
Perhatikan struktur inheritance:
list
│
└── SuperList
Artinya SuperList merupakan turunan dari list.
Method Overriding pada __len__()
Pada list, Python sudah memiliki perilaku tertentu untuk fungsi len().
Contohnya:
numbers = [1, 2, 3]
print(len(numbers))
Output:
3
Namun pada SuperList, kita melakukan override terhadap __len__():
class SuperList(list):
def __len__(self):
return 1000
Sekarang:
super_list1 = SuperList()
super_list1.append(5)
print(len(super_list1))
Output:
1000
Meskipun sebenarnya hanya terdapat satu elemen di dalam list.
Mengapa len() Menghasilkan 1000?
Ketika kita menjalankan:
len(super_list1)
Python akan menggunakan dunder method:
__len__()
Karena SuperList memiliki implementasi sendiri:
def __len__(self):
return 1000
maka Python menggunakan implementasi tersebut.
Secara konsep:
len(super_list1)
│
↓
super_list1.__len__()
│
↓
1000
Tetap Memiliki Fitur list
Meskipun SuperList mengubah perilaku __len__(), class tersebut tetap mewarisi berbagai kemampuan dari list.
Contohnya:
super_list1 = SuperList()
super_list1.append(5)
super_list1.append(10)
super_list1.append(15)
Kita masih dapat mengakses elemen menggunakan indeks:
print(super_list1[0])
print(super_list1[1])
print(super_list1[2])
Output:
5
10
15
Artinya, inheritance tetap memberikan berbagai kemampuan dari parent class list.
Contoh Lengkap
Berikut implementasi lengkap latihan:
class SuperList(list):
def __len__(self):
return 1000
super_list1 = SuperList()
super_list1.append(5)
print(super_list1[0])
print(len(super_list1))
print(isinstance(super_list1, SuperList))
print(isinstance(super_list1, list))
Output:
5
1000
True
True
Memahami isinstance()
Pada bagian akhir kita menggunakan:
isinstance(super_list1, SuperList)
Hasilnya:
True
Hal ini karena super_list1 merupakan object yang dibuat dari class SuperList.
Kita juga dapat melakukan:
isinstance(super_list1, list)
Hasilnya juga:
True
Mengapa?
Karena SuperList merupakan subclass dari list.
Strukturnya:
list
↑
│ inheritance
│
SuperList
│
│ instantiation
↓
super_list1
Dengan demikian, super_list1 merupakan instance dari SuperList sekaligus dianggap sebagai instance dari list.
Mewarisi Built-in Class
Inheritance tidak hanya dapat digunakan dengan class yang kita buat sendiri.
Python juga memungkinkan kita mewarisi built-in class.
Contohnya:
class SuperList(list):
pass
Kita juga dapat membuat class yang mewarisi tipe bawaan lainnya, seperti:
list
dict
str
Contoh:
class MyList(list):
pass
atau:
class MyDictionary(dict):
pass
Dengan cara ini, kita dapat membuat versi khusus dari built-in class Python.
Mengapa Menggunakan Inheritance?
Dengan inheritance, kita tidak perlu membuat ulang seluruh fitur yang sudah dimiliki list.
Kita cukup mewarisi:
class SuperList(list):
Kemudian kita hanya perlu menambahkan atau mengubah perilaku yang diperlukan.
Dalam latihan ini, kita hanya mengubah:
def __len__(self):
return 1000
Sementara fitur lainnya tetap berasal dari list.
Konsep yang Dipelajari
Latihan SuperList menggabungkan beberapa konsep OOP.
Inheritance
SuperList mewarisi list:
class SuperList(list):
Method Overriding
SuperList mengubah implementasi __len__():
def __len__(self):
return 1000
Dunder Methods
__len__() merupakan dunder method yang digunakan Python ketika fungsi len() dipanggil.
Built-in Class
list merupakan built-in class Python yang dapat digunakan sebagai parent class.
isinstance()
Digunakan untuk memeriksa hubungan antara object dan class:
isinstance(super_list1, SuperList)
dan:
isinstance(super_list1, list)
Kesimpulan
SuperList menunjukkan bahwa kita dapat menggunakan inheritance untuk membuat versi khusus dari built-in class Python.
Dengan:
class SuperList(list):
kita mendapatkan seluruh kemampuan dasar dari list.
Kemudian kita dapat mengubah perilaku tertentu menggunakan method overriding:
def __len__(self):
return 1000
Sehingga:
super_list1 = SuperList()
super_list1.append(5)
print(super_list1[0])
print(len(super_list1))
menghasilkan:
5
1000
Latihan ini menunjukkan bahwa inheritance tidak hanya digunakan untuk class buatan sendiri, tetapi juga dapat digunakan untuk memperluas dan memodifikasi built-in class Python.