Berkaitan dengan kedua jenis atribut yang telah aku pelajari, aku menggunakan contoh berikut untuk memperkuat pemahamanky terkait dengan konsep class attribute.
#Definisikan Class Karyawan class Karyawan: nama_perusahaan = 'ABC' #Inisiasi object yang dinyatakan dalam variabel aksara dan senja aksara = Karyawan() senja = Karyawan() #Cetak nama perusahaan melalui penggunaan keyword __class__ #pada class attribute nama_perusahaan print(aksara.__class__.nama_perusahaan) # Ubah nama_perusahaan menjadi 'DEF' aksara.__class__.nama_perusahaan = 'DEF' #Cetak nama_perusahaan objek aksara dan senja print(aksara.__class__.nama_perusahaan) print(senja.__class__.nama_perusahaan)
Output :ABCDEF
DEF
Link materi : academy.dqlab.id/main/livecode/161/301/1354.
Class dan Objek dalam Python - Part 4
Atribut nama, usia dan pendapatan merupakan contoh dari instance variabel. Sebagai tambahan, fungsi init() di dalam class Karyawan secara khusus disebut sebagai constructor. Melalui sebuah constructor, aku dapat meng-assign (menginisialisasi) atribut-atribut milik sebuah objek. Pada bahasa pemrograman Python, setiap fungsi (termasuk constructor) akan menerima dirinya sendiri (self) sebagai parameter pertama dari fungsi. Kemudian, aku dapat menambahkan parameter-parameter lain setelah parameter self sesuai dengan kebutuhan. Seperti pada contoh di atas, saat objek dibuat (diinisialisasi), aku dapat melemparkan nama, usia dan pendapatan melalui syntax,Terakhir, aku belajar bahwa objek aksara dan senja diizinkan untuk memiliki nama, usia dan pendapatan yang berbeda. Untuk mengakses instance attribute dalam sebuah class, aku perlu menuliskan sintaks self diikuti dengan tanda titik (.) sebelum nama atribut.
#Definisikan class Karyawan class Karyawan: nama_perusahaan = 'ABC' def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan #Buat object bernama aksara dan senja aksara = Karyawan('Aksara', 25, 8500000) senja = Karyawan('Senja', 28, 12500000) #Cetak objek bernama aksara print(aksara.nama + ', Usia: ' + str(aksara.usia) + ', Pendapatan ' + str(aksara.pendapatan)) #Cetak objek bernama senja print(senja.nama + ', Usia: ' + str(senja.usia) + ', Pendapatan ' + str(senja.pendapatan))
Output :Aksara, Usia: 25, Pendapatan 8500000Senja, Usia: 28, Pendapatan 12500000
Link materi : academy.dqlab.id/main/livecode/161/301/1355
Behavior pada Class
Selain dapat mendefinisikan atribut, dalam sebuah class, aku diperbolehkan untuk mendefinisikan fungsi-fungsi (behavior) dari sebuah class.
Dari potongan kode yang telah aku gunakan, aku dapat menambahkan fungsi-fungsi berkaitan dengan class Karyawan. Sebagai contoh, seorang karyawan tentunya mungkin saja memiliki pendapatan tambahan berdasarkan banyaknya kerja lembur dan jumlah proyek yang telah diselesaikan. Untuk menghitung pendapatan tambahan dari jumlah kerja lembur dan jumlah proyek yang diselesaikan oleh seorang karyawan dan mengakses pendapatan total dari seorang karyawan, aku dapat menuliskan potongan kode berikut.
#Definisikan class Karyawan berikut dengan attribut dan fungsinya class Karyawan: nama_perusahaan = 'ABC' insentif_lembur = 250000 def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan self.pendapatan_tambahan = 0 def lembur(self): self.pendapatan_tambahan += self.insentif_lembur def tambahan_proyek(self, insentif_proyek): self.pendapatan_tambahan += insentif_proyek def total_pendapatan(self): return self.pendapatan + self.pendapatan_tambahan #Buat object dari karwayan bernama Aksara dan Senja aksara = Karyawan('Aksara', 25, 8500000) senja = Karyawan('Senja', 28, 12500000) #Aksara melaksanakan lembur aksara.lembur() #Senja memiliki proyek tambahan senja.tambahan_proyek(2500000) # Cetak pendapatan total Aksara dan Senja print('Pendapatan Total Aksara: ' + str(aksara.total_pendapatan())) print('Pendapatan Total Senja: ' +str(senja.total_pendapatan()))
Output :Pendapatan Total Aksara: 8750000Pendapatan Total Senja: 15000000
Link materi : academy.dqlab.id/main/livecode/161/301/1358
Tugas Praktek
#Definisikan class Karyawan class Karyawan: def __init__(self, nama, usia, pendapatan, insentif_lembur): self.nama = nama self.usia = usia self.pendapatan = pendapatan self.pendapatan_tambahan = 0 self.insentif_lembur = insentif_lembur def lembur(self): self.pendapatan_tambahan += self.insentif_lembur def tambahan_proyek(self, jumlah_tambahan): self.pendapatan_tambahan += jumlah_tambahan def total_pendapatan(self): return self.pendapatan + self.pendapatan_tambahan #Definisikan class Perusahaan class Perusahaan: def __init__(self, nama, alamat, nomor_telepon): self.nama = nama self.alamat = alamat self.nomor_telepon = nomor_telepon self.list_karyawan = [] def aktifkan_karyawan(self, karyawan): self.list_karyawan.append(karyawan) def nonaktifkan_karyawan(self, nama_karyawan): karyawan_nonaktif = None for karyawan in self.list_karyawan: if karyawan.nama == nama_karyawan: karyawan_nonaktif = karyawan break if karyawan_nonaktif is not None: self.list_karyawan.remove(karyawan_nonaktif)
Link materi : academy.dqlab.id/main/livecode/161/301/1359
Tugas Praktek
#Definisikan perusahaan perusahaan = Perusahaan('ABC', 'Jl. Jendral Sudirman, Blok 11', '(021) 95205XX') #Definisikan nama-nama karyawan karyawan_1 = Karyawan('Ani', 25, 8500000, 100000) karyawan_2 = Karyawan('Budi', 28, 12000000, 150000) karyawan_3 = Karyawan('Cici', 30, 15000000, 200000) #Aktifkan karyawan di perusahaan ABC perusahaan.aktifkan_karyawan(karyawan_1) perusahaan.aktifkan_karyawan(karyawan_2) perusahaan.aktifkan_karyawan(karyawan_3)
Link materi : academy.dqlab.id/main/livecode/161/301/1360
Encapsulation pada Python - Part 2
Terdapat 2 macam access modifier dalam Python, yakni :
- Public access: dapat aku definisikan dengan secara langsung menuliskan nama dari atribut/ fungsi. Dalam sebuah objek, atribut/fungsi yang bersifat public access dapat diakses di luar scope sebuah class
- Private access: dapat aku definisikan dengan menambahkan double underscore (__) sebelum menuliskan nama dari atribut/fungsi. Dalam sebuah objek, atribut/fungsi yang bersifat private access hanya dapat diakses di dalam scope sebuah class.
Kemudian, atribut __nama, __usia, __pendapatan_tambahan, __insentif_lembur dan pendapatan bersifat private sehingga atribut ini hanya dapat diakses di dalam scope class Karyawan.
Saat aku mencoba mengakses atribut-atribut ini di luar scope class Karyawan, Python akan mengembalikan error yang menyatakan bahwa class Karyawan tidak memiliki atribut tersebut.
#Definisikan class Karyawan class Karyawan: nama_perusahaan = 'ABC' __insentif_lembur = 250000 def __init__(self, nama, usia, pendapatan): self.__nama = nama self.__usia = usia self.__pendapatan = pendapatan self.__pendapatan_tambahan = 0 def lembur(self): self.__pendapatan_tambahan += self.__insentif_lembur def tambahan_proyek(self, insentif_proyek): self.__pendapatan_tambahan +=insentif_proyek def total_pendapatan(self): return self.__pendapatan + self.__pendapatan_tambahan #Buat objek karyawan bernama Aksara aksara = Karyawan('Aksara', 25, 8500000) #Akses ke attribute class Karyawan print(aksara.__class__.Karyawan) #Akan menimbulkan error ketika di run print(aksara.nama)
Output :AttributeError Traceback (most recent call last)in
17 aksara = Karyawan('Aksara', 25, 8500000)
18 # Akses ke attribute class Karyawan
---> 19 print(aksara.__class__.Karyawan)
20 # Akan menimbulkan error ketika di run
21 print(aksara.nama)
AttributeError: type object 'Karyawan' has no attribute 'Karyawan'
Link materi : academy.dqlab.id/main/livecode/161/301/1362
Inheritance pada Python – Part 1
Inheritance adalah salah satu mekanisme di konsep OO yang mengizinkan aku untuk mendefinisikan sebuah class baru berdasarkan class yang sebelumnya telah dideklarasikan.
Melalui konsep inheritance, sebuah class baru dapat memiliki atribut dan fungsi pada class yang sebelumnya telah didefinisikan. Pada konsep inheritance, atribut/fungsi yang akan diwariskan hanyalah atribut/fungsi dengan access modifier public, atribut/fungsi dengan access modifier private tidak akan diturunkan.
#Definisikan class Karyawan (sebagai base class) class Karyawan: nama_perusahaan = 'ABC' insentif_lembur = 250000 def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan self.pendapatan_tambahan = 0 def lembur(self): self.pendapatan_tambahan += self.insentif_lembur def tambahan_proyek(self, insentif_proyek): self.pendapatan_tambahan += insentif_proyek def total_pendapatan(self): return self.pendapatan + self.pendapatan_tambahan #Buat class turunan (sebagai inherit class) dari class karyawan, #yaitu class AnalisData class AnalisData(Karyawan): def __init__(self, nama, usia, pendapatan): #melakukan pemanggilan konstruktur class Karyawan super().__init__(nama, usia, pendapatan) #Buat kembali class turunan (sebagai inherit class) dari class karyawan, #yaitu class IlmuwanData class IlmuwanData(Karyawan): def __init__(self, nama, usia, pendapatan): #melakukan pemanggilan konstruktur class Karyawan super().__init__(nama, usia, pendapatan) #Buat objek karyawan yang bekerja sebagai AnalisData aksara = AnalisData('Aksara', 25, 8500000) aksara.lembur() print(aksara.total_pendapatan()) #Buat objek karyawan yang bekerja sebagai IlmuwanData senja = IlmuwanData('Senja', 28, 13000000) senja.tambahan_proyek(2000000) print(senja.total_pendapatan())
Output :875000015000000
Link materi : academy.dqlab.id/main/livecode/161/301/1365
Inheritance pada Python – Part 2
child class mewarisi fungsi/atribut dari parent class dengan menggunakan fungsi super(). Melalui konsep inheritance, child class dapat memodifikasi atribut/ fungsi yang diwarisi oleh sebuah parent class dengan mendefinisikan ulang atribut/ fungsi menggunakan nama yang sama.
#Definisikan class Karyawan (sebagai base class) class Karyawan: nama_perusahaan = 'ABC' insentif_lembur = 250000 def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan self.pendapatan_tambahan = 0 def lembur(self): self.pendapatan_tambahan += self.insentif_lembur def tambahan_proyek(self, insentif_proyek): self.pendapatan_tambahan += insentif_proyek def total_pendapatan(self): return self.pendapatan + self.pendapatan_tambahan #Buat class turunan (sebagai inherit class) dari class karyawan, #yaitu class AnalisData class AnalisData(Karyawan): def __init__(self, nama, usia, pendapatan): #melakukan pemanggilan konstruktur class Karyawan super().__init__(nama, usia, pendapatan) #Buat kembali class turunan (sebagai inherit class) dari class karyawan, #yaitu class IlmuwanData class IlmuwanData(Karyawan): # mengubah atribut insentif_lembur yang digunakan pada fungsi lembur() insentif_lembur = 500000 def __init__(self, nama, usia, pendapatan): super().__init__(nama, usia, pendapatan) #Buat objek karyawan yang bekerja sebagai AnalisData aksara = AnalisData('Aksara', 25, 8500000) aksara.lembur() print(aksara.total_pendapatan()) #Buat objek karyawan yang bekerja sebagai IlmuwanData senja = IlmuwanData('Senja', 28, 13000000) senja.lembur() print(senja.total_pendapatan())
Output :875000013500000
Link materi : academy.dqlab.id/main/livecode/161/301/1370
Polymorphism pada Python - Part 1
Selain dapat mendefinisikan ulang nilai dari atribut yang diwarisi oleh parent class seperti pada contoh di atas, juga dapat mendefinisikan ulang fungsi yang telah diwarisi oleh parent class.
Saat mendefinisikan kembali fungsi yang telah diwarisi oleh parent class, secara tidak langsung aku telah menerapkan salah satu mekanisme yang secara khusus pada paradigma OO disebut dengan istilah polymorphism. Melakukan pemanggilan konstruktur class Karyawan, menerapkan polymorphism dengan mendefinisikan kembali fungsi lembur() pada AnalisData, dan menambahkan 10% atau 0,1 tambahan pendapatan pada class AnalisData. Fungsi lembur() pada objek aksara sebagai bagian dari class AnalisData akan menambahkan total_pendapatan milik objek sebesar 850000 (10% dari pendapatannya) mengikuti definisi dari fungsi lembur() pada class AnalisData akan menghasilkan output: 9350000.
#Definisikan class Karyawan (sebagai base class) class Karyawan: nama_perusahaan = 'ABC' insentif_lembur = 250000 def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan self.pendapatan_tambahan = 0 def lembur(self): self.pendapatan_tambahan += self.insentif_lembur def tambahan_proyek(self, insentif_proyek): self.pendapatan_tambahan += insentif_proyek def total_pendapatan(self): return self.pendapatan + self.pendapatan_tambahan #Buat class turunan (sebagai inherit class) dari class karyawan, #yaitu class AnalisData class AnalisData(Karyawan): def __init__(self, nama, usia, pendapatan): #melakukan pemanggilan konstruktur class Karyawan super().__init__(nama, usia, pendapatan) #menerapkan polymorphism dengan mendefinisikan kembali fungsi #lembur() pada class AnalisData def lembur(self): #pendapatan tambahan pada class AnalisData sebesar #10 % dari pendapatannya. self.pendapatan_tambahan += int(self.pendapatan * 0.1) #Buat objek karyawan yang bekerja sebagai AnalisData aksara = AnalisData('Aksara', 25, 8500000) aksara.lembur() print(aksara.total_pendapatan())
Output :9350000Link materi : academy.dqlab.id/main/livecode/161/304/1373.
Polymorphism pada Python - Part 2
Pada konsep inheritance, melalui fungsi super(), selain dapat mengakses constructor milik parent class, child class juga dapat mengakses atribut/fungsi yang dimiliki oleh parent class akan menghasilkan output: 9175000
#Definisikan class Karyawan (sebagai base class) class Karyawan: nama_perusahaan = 'ABC' insentif_lembur = 250000 def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan self.pendapatan_tambahan = 0 def lembur(self): self.pendapatan_tambahan += self.insentif_lembur def tambahan_proyek(self, insentif_proyek): self.pendapatan_tambahan += insentif_proyek def total_pendapatan(self): return self.pendapatan + self.pendapatan_tambahan #Buat class turunan (sebagai inherit class) dari class karyawan, #yaitu class AnalisData class AnalisData(Karyawan): def __init__(self, nama, usia, pendapatan): super().__init__ (nama, usia, pendapatan) #mendefinisikan kembali fungsi lembur() pada class AnalisData def lembur(self): #memanggil fungsi lembur pada class Karyawan super().lembur() #pendapatan tambahan pada class AnalisData sebesar #5 % dari pendapatannya. self.pendapatan_tambahan += int(self.pendapatan * 0.05) #Buat objek karyawan yang bekerja sebagai AnalisData aksara = AnalisData('Aksara', 25, 8500000) aksara.lembur() print(aksara.total_pendapatan())
Link materi : academy.dqlab.id/main/livecode/161/304/1374
Tugas Praktek
#Definisikan class Karyawan class Karyawan: nama_perusahaan = 'ABC' def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan #Buat object bernama aksara dan senja aksara = Karyawan('Aksara', 25, 8500000) senja = Karyawan('Senja', 28, 12500000) #Cetak objek bernama aksara print(aksara.nama + ', Usia: ' + str(aksara.usia) + ', Pendapatan ' + str(aksara.pendapatan)) #Cetak objek bernama senja print(senja.nama + ', Usia: ' + str(senja.usia) + ', Pendapatan ' + str(senja.pendapatan))0
Link materi : academy.dqlab.id/main/livecode/161/304/1375
Tugas Praktek
#Definisikan class Karyawan class Karyawan: nama_perusahaan = 'ABC' def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan #Buat object bernama aksara dan senja aksara = Karyawan('Aksara', 25, 8500000) senja = Karyawan('Senja', 28, 12500000) #Cetak objek bernama aksara print(aksara.nama + ', Usia: ' + str(aksara.usia) + ', Pendapatan ' + str(aksara.pendapatan)) #Cetak objek bernama senja print(senja.nama + ', Usia: ' + str(senja.usia) + ', Pendapatan ' + str(senja.pendapatan))1
Link materi : academy.dqlab.id/main/livecode/161/304/1376.
Tugas Praktek
NamaUsiaPendapatanBudi??Didi25?Hadi?8000000Aku di minta untuk mengisi tabel, dengan detail berikut:
Budi berusia = 21 dan pendapatan = 5000000
Didi berusia 25 dan pendapatan = 5000000
Hadi berusia 21 dan pendapatan = 8000000
#Definisikan class Karyawan class Karyawan: nama_perusahaan = 'ABC' def __init__(self, nama, usia, pendapatan): self.nama = nama self.usia = usia self.pendapatan = pendapatan #Buat object bernama aksara dan senja aksara = Karyawan('Aksara', 25, 8500000) senja = Karyawan('Senja', 28, 12500000) #Cetak objek bernama aksara print(aksara.nama + ', Usia: ' + str(aksara.usia) + ', Pendapatan ' + str(aksara.pendapatan)) #Cetak objek bernama senja print(senja.nama + ', Usia: ' + str(senja.usia) + ', Pendapatan ' + str(senja.pendapatan))2
Output :Budi21
5000000
Didi
25
5000000
Hadi
21
8000000
Link materi : academy.dqlab.id/main/livecode/161/304/1378
Studi Kasus dari Senja
Di perusahaan ini, seorang analis data yang masuk umumnya berusia 21, memiliki pendapatan senilai 6.500.000 dan insentif lembur senilai 100.000. Kemudian, untuk seorang ilmuwan data yang masuk umumnya berusia 25, memiliki pendapatan senilai 12.000.000, dan insentif lembur senilai 150.000. Di sisi lain, untuk tenaga lepas, hanya terdapat pendapatan umum senilai 4000000 untuk pembersih data dan 2500000 untuk dokumenter teknis.
NamaUsiaPekerjaanPendapatanAni25Pembersih Data-Budi18Dokumenter Teknis-Cici-Ilmuwan Data-Didi32Ilmuwan Data20000000Efi-Analis Data-Febi28Analis Data12000000Note: saat usia/pendapatan kosong maka usia/pendapatan mengikuti standar perusahaan.
“Dengan kasus ini, berarti di akhir aku harus mencetak total pengeluaran perusahaan untuk menguji kelancaranku dalam menerapkan OOP dengan Python nih,” gumamku sambil berkutat pada baris-baris code di code editor.