class dan method Abstrak
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 25 dari 64.
Abstract class adalah class yang tidak dapat dibuat instance-nya secara langsung dan berisi abstract method yang harus diimplementasikan oleh subclass.
Bayangkan seperti sebuah formulir: Abstract class seperti kode formulir wajib yang memiliki beberapa kolom yang harus diisi (abstract method) dan beberapa kolom opsional (method konkret). Kamu tidak dapat mengirim formulir itu begitu saja. Kamu harus mengisi semua kolom yang wajib terlebih dahulu. Demikian pula, kamu tidak dapat membuat instance dari abstract class sampai semua abstract method diimplementasikan dalam subclass.
Impor module abc untuk membuat class abstrak:
from abc import ABC, abstractmethodBuat class abstrak dengan method abstrak:
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
def describe(self):
return "This is a shape" # method konkret (memiliki implementasi)Dekorator @abstractmethod menandai method yang wajib diimplementasikan oleh subclass. Method ini adalah "field wajib" pada formulirmu. Method biasa seperti describe() dapat memiliki implementasi dan diwariskan apa adanya. Method ini adalah "field yang sudah diisi".
Mengapa menggunakan abstract class? Abstract class memberlakukan kontrak. Jika kamu membuat class Shape, kamu menyatakan bahwa "setiap bentuk HARUS bisa menghitung luas dan kelilingnya." Ini mencegah bug yang bisa terjadi jika kamu lupa mengimplementasikan method penting.
Coba buat sebuah instance dari abstract class:
# Ini akan menyebabkan error:
# shape = Shape() # TypeError: Can't instantiate abstract classError ini disengaja, seperti saat mencoba mengirim formulir kosong. Python mengatakan, "Kamu belum mengisi kolom yang wajib diisi (method area dan perimeter)!"
Buat subclass konkret yang mengimplementasikan semua method abstrak:
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
def perimeter(self):
return 2 * 3.14 * self.radiusSekarang kita sudah "mengisi semua field yang diperlukan", kita sudah mengimplementasikan area() dan perimeter(). Class Circle kini menjadi class konkret yang lengkap dan dapat dibuat sebagai instance.
Sekarang kamu bisa membuat instance dari class konkret:
circle = Circle(5)
print(circle.area())
print(circle.perimeter())
print(circle.describe()) # method konkret yang diwarisiBuat subclass konkret lainnya:
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width self.height
def perimeter(self):
return 2 * (self.width + self.height)
rectangle = Rectangle(4, 6)
print(rectangle.area())
print(rectangle.perimeter())Output:
78.5
31.400000000000002
This is a shape
24
20Abstract class mendefinisikan kontrak yang harus diikuti oleh subclass. Gunakan ABC dan @abstractmethod untuk membuat abstract class. Subclass harus mengimplementasikan semua abstract method, jika tidak, subclass tersebut juga akan menjadi abstract. Ini memastikan konsistensi dan mencegah implementasi yang tidak lengkap.
Tantangan
SedangDalam tantangan ini, kamu akan menerapkan sistem pemrosesan pembayaran.
Kamu perlu menyelesaikan penerapan di file-file berikut:
paymentmethod.py- class dasar abstrak dengan logika validasicreditcard.py- penerapan pembayaran dengan kartu kreditpaypal.py- penerapan pembayaran PayPal
Ikuti komentar TODO di setiap file untuk menerapkan fungsionalitas yang diperlukan. Komentar tersebut akan memandumu langkah demi langkah untuk membuat method abstrak, menerapkan subclass konkret, dan membangun hubungan import yang tepat antarfile.
File driver.py berisi kasus uji yang akan memverifikasi apakah penerapanmu berfungsi dengan benar, memproses berbagai skenario pembayaran, dan menampilkan detail yang sesuai untuk setiap method pembayaran.
Coba sendiri
from creditcard import CreditCard
from paypal import PayPal
# Uji implementasinya. JANGAN UBAH KODE UJI INI
cc = CreditCard("1234567890123456")
pp = PayPal("user@example.com")
# Proses pembayaran yang valid
if cc.validate(100):
print(cc.process_payment(100))
print(cc.payment_details())
if pp.validate(200):
print(pp.process_payment(200))
print(pp.payment_details())
# Coba jumlah yang tidak valid
if not pp.validate(0):
print("Invalid payment amount")
# Ini akan menimbulkan error jika tidak lagi menjadi komentar:
# pm = PaymentMethod() # Tidak bisa membuat instance dari class abstrakPelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass vs objectParameter selfmethodAtributMethod Konstruktor (__init__)Rangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan DasarFungsi super()Penimpaan MethodPewarisan BergandaUrutan Resolusi MethodRingkasan: Hierarki Karyawan5Polimorfisme
Meninjau Ulang Method OverridingDuck Typingclass dan method AbstrakDesain InterfaceRingkasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanMixinsMetode Statis dan Metode ClassDecorator ClassPengelola Konteks11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Property class
Variabel instance vs variabel classDekorator propertyAtribut privatRangkuman: Pengelola Rekening Bank6Enkapsulasi
Anggota Public, Protected, PrivateModifier AksesPenyembunyian InformasiDecorator Property Tingkat LanjutUlasan: Sistem Catatan Siswa12Proyek: Manajemen Perpustakaan
Ikhtisar Proyekclass Buku dan PenggunaSistem PeminjamanFitur PencarianAntarmuka AdminPengujian dan IntegrasiLatihan sendiri: Compiler Python online