class dan method Abstrak
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 25 dari 64.
Kelas abstrak adalah kelas yang tidak dapat dibuat instansnya secara langsung dan berisi metode abstrak yang harus diimplementasikan oleh subkelas.
Bayangkan seperti formulir: Kelas abstrak seperti kode formulir wajib yang memiliki beberapa kolom yang harus diisi (metode abstrak) dan beberapa kolom yang opsional (metode konkret). Kamu tidak dapat mengirim formulir itu sendiri, kamu harus mengisi semua kolom wajib terlebih dahulu. Demikian pula, kamu tidak dapat membuat instans kelas abstrak sampai semua metode abstrak diimplementasikan dalam subkelas.
Impor modul 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 “kolom wajib” pada formulirmu. Method biasa seperti describe() dapat memiliki implementasi dan diwarisi apa adanya. Method ini adalah “kolom yang sudah diisi”.
Mengapa menggunakan kelas abstrak? Kelas abstrak menerapkan kontrak. Jika kamu membuat kelas Shape, artinya kamu mengatakan, "setiap bentuk WAJIB bisa menghitung luas dan kelilingnya." Ini mencegah bug yang mungkin terjadi jika kamu lupa mengimplementasikan method penting.
Coba buat instance dari class abstrak:
# Ini akan menyebabkan error:
# shape = Shape() # TypeError: Can't instantiate abstract classerror ini disengaja, seperti mencoba mengirim formulir kosong. Python mengatakan, "Kamu belum mengisi kolom wajib (method area dan perimeter)!"
Buat subclass konkret yang mengimplementasikan semua metode 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 telah "melengkapi semua kolom yang diperlukan", kita telah mengimplementasikan area() dan perimeter(). Class Circle kini menjadi class konkret yang lengkap dan dapat dibuat instance-nya.
Sekarang kamu dapat 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
20Kelas abstrak menetapkan kontrak yang harus dipatuhi oleh subkelas. Gunakan ABC dan @abstractmethod untuk membuat kelas abstrak. Subkelas harus mengimplementasikan semua method abstrak, atau kelas tersebut juga akan menjadi abstrak. Hal 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 berikut:
paymentmethod.py- class dasar abstrak dengan logika validasicreditcard.py- penerapan pembayaran 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 menetapkan hubungan impor 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 metode 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 bukan lagi 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
Pengantar OOPFile EksternalClass dan ObjectParameter selfMethodAtributMethod Constructor (__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