Menu
CoddyTech

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, abstractmethod

Buat 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 class

error 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.radius

Sekarang 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 diwarisi

Buat 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
20

Kelas 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.

challenge icon

Tantangan

Sedang

Dalam tantangan ini, kamu akan menerapkan sistem pemrosesan pembayaran.

Kamu perlu menyelesaikan penerapan di file berikut:

  • paymentmethod.py - class dasar abstrak dengan logika validasi
  • creditcard.py - penerapan pembayaran kartu kredit
  • paypal.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 abstrak
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Python online