Menu
CoddyTech

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, 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 "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 class

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

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

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

challenge icon

Tantangan

Sedang

Dalam tantangan ini, kamu akan menerapkan sistem pemrosesan pembayaran.

Kamu perlu menyelesaikan penerapan di file-file berikut:

  • paymentmethod.py - class dasar abstrak dengan logika validasi
  • creditcard.py - penerapan pembayaran dengan 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 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 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