Program
Komponen kunci dalam pengembangan perangkat lunak modern adalah pemrograman berorientasi objek (OOP), yang memberi kemampuan bagi programmer untuk mengorganisir kode secara skalabel, modular, dan dapat digunakan kembali. Kelas abstrak adalah salah satu dari banyak konsep OOP yang penting untuk membuat templat yang dapat digunakan oleh kelas lain. Artikel ini akan menjelaskan kelas abstrak, manfaatnya, dan cara menggunakan modul abc milik Python untuk membangunnya dengan sukses.
Jika Anda baru mengenal Python, Anda dapat mempelajari cara bekerja dengan modul dan paket, menggunakan tipe data bawaan, serta menulis fungsi kustom melalui jalur keterampilan kami.
Apa itu Kelas Abstrak?
Kelas abstrak mirip dengan templat untuk kelas lain. Kelas ini mendefinisikan metode yang harus disertakan dalam kelas mana pun yang mewarisinya, tetapi tidak menyediakan kode nyata untuk metode-metode tersebut.
Bayangkan seperti resep tanpa bahan spesifik—resep memberi tahu langkah-langkahnya, tetapi detailnya bergantung pada subkelas.
Contoh:
Misalnya Anda membangun program untuk menghitung luas berbagai bentuk.
- Anda membuat kelas abstrak bernama
Shapeyang menyatakan setiap bentuk harus memiliki metodearea(). - Tetapi
Shapetidak mendefinisikan cara kerjaarea()—karena rumusnya bergantung pada jenis bentuknya. - Setiap bentuk spesifik (seperti
CircleatauRectangle) mewarisi dariShapedan menyediakan versinya sendiri untukarea().
Jika Anda ingin mempelajari lebih lanjut konsep-konsep kunci Python, Anda dapat mendaftar di kursus Intermediate Object-Oriented Programming in Python kami.
Mengapa menggunakan kelas abstrak di Python?
Kelas abstrak berguna saat Anda ingin:
- Menegakkan implementasi metode: Metode-metode dalam kelas abstrak berfungsi sebagai kontrak, yang mengharuskan setiap subkelas menyediakan implementasinya sendiri. Ini menurunkan kemungkinan implementasi yang tidak konsisten atau kurang dengan memastikan fungsi tertentu hadir di semua kelas turunan.
- Mendorong penggunaan kembali kode: kelas abstrak dapat memiliki metode konkret dan abstrak. Metode konkret sangat mengurangi duplikasi kode dan mendorong prinsip DRY (Don’t Repeat Yourself) dengan menyediakan fungsionalitas bersama yang dapat diwarisi oleh semua subkelas.
- Meningkatkan keterbacaan dan kemudahan pemeliharaan: Kelas abstrak membantu pengembang lebih memahami struktur dan fungsionalitas perangkat lunak dengan menyediakan kerangka yang konsisten dan transparan. Struktur ini membuat kode lebih mudah dipelihara dengan menegakkan prinsip desain seperti tanggung jawab tunggal dan pemisahan tanggung jawab.
- Mendorong polimorfisme: Kelas abstrak memungkinkan penulisan kode umum yang bekerja baik dengan berbagai subkelas. Pengembang dapat membuat fungsi atau metode yang dapat menangani subkelas mana pun dari kelas abstrak berkat fleksibilitas ini, yang meningkatkan sifat dapat diperluasnya kode dan kemampuan beradaptasi terhadap perubahan di masa mendatang.
Anda dapat memastikan bahwa subkelas apa pun, seperti Dog atau Cat, mengimplementasikan versinya sendiri dari metode speak, misalnya jika Anda memiliki kelas abstrak Animal dengan metode abstrak speak. Konsistensi ini membuat kode Anda andal dan dapat diprediksi.
Modul abc di Python
Modul abc di Python menawarkan dukungan bawaan yang kuat untuk kelas abstrak. Modul ini, singkatan dari "Abstract Base Classes," memberi programmer alat yang diperlukan untuk membuat kelas abstrak, termasuk dekorator abstractmethod dan kelas ABC.
Dengan mendefinisikan metode abstrak dan mewajibkan implementasinya di subkelas, alat-alat ini membantu Anda menjaga keseragaman dan kepatuhan terhadap antarmuka yang telah ditentukan. Dengan mewajibkan implementasi metode esensial di semua kelas turunan dan mengizinkan implementasi parsial untuk fungsionalitas bersama di kelas dasar abstrak, modul ini juga mendorong pola desain yang lebih baik.
Karena itu, modul ABC adalah komponen penting untuk mengorganisir aplikasi Python yang skalabel, tangguh, dan stabil.
Membuat Kelas Abstrak Python
Dua komponen esensial diperkenalkan dalam modul ABC:
Abstract Base Class, atau ABC
Kelas ABC adalah fitur bawaan Python yang berfungsi sebagai dasar fundamental untuk mengembangkan kelas abstrak. Anda harus mewarisi dari ABC untuk mendefinisikan kelas abstrak. Pewarisan ini menunjukkan bahwa kelas tersebut bersifat abstrak dan tidak dapat diinstansiasi secara langsung. Dengan bertindak sebagai cetak biru, kelas abstrak memastikan bahwa subkelas konkret mana pun mematuhi serangkaian aturan.
Anda dapat mendefinisikan metode abstrak di dalam kelas abstrak dengan menggunakan dekorator abstractmethod. Metode abstrak adalah placeholder yang harus diimplementasikan dan ditimpa oleh subkelas konkret. Ini membuat kode konsisten dan dapat diprediksi dengan menjamin bahwa semua kelas turunan menyediakan fungsionalitas untuk metode yang ditetapkan. Dekorator abstractmethod adalah alat yang berguna untuk mewajibkan implementasi metode sambil memberikan fleksibilitas kepada subkelas dalam cara mereka memenuhi persyaratan tersebut.
Berikut contoh dasar:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14159 * self.radius ** 2
def perimeter(self):
return 2 * 3.14159 * self.radius
# Uncommenting the following line will raise an error because we’re missing method implementations
# shape = Shape() # TypeError: Can't instantiate abstract class Shape with abstract methods #area, perimeter
circle = Circle(5)
print(f"Area: {circle.area()}")
print(f"Perimeter: {circle.perimeter()}")
# Area: 78.53975
# Perimeter: 31.4159
Jika Anda mencari proyek Python yang lebih praktis, lihat daftar 60 proyek Python terbaik kami untuk pengembang di semua tingkat.
Bagaimana modul abc menegakkan implementasi metode
Setiap subkelas dari kelas abstrak dijamin mengimplementasikan metode yang didekorasi berkat dekorator abstractmethod. Sebagai pencegahan, ini menghentikan pembuatan subkelas yang tidak memiliki kapabilitas yang diperlukan.
Python akan melaporkan TypeError saat instansiasi subkelas yang tidak menimpa semua metode abstrak. Penegakan ketat ini menurunkan kemungkinan cacat dan meningkatkan stabilitas kode dengan membantu pengembang mengidentifikasi kekurangan implementasi sejak dini.
Ini juga menjamin bahwa semua subkelas konkret mengikuti perilaku dan desain yang dimaksudkan oleh kelas abstrak.
Contohnya:
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
# Missing area and perimeter implementation
# This will raise an error
rectangle = Rectangle(5, 10)
# TypeError: Can't instantiate abstract class Rectangle with abstract methods area, perimeter
Metode Kelas Abstrak di Python
Di Python, mendefinisikan kelas abstrak dilakukan dengan menggunakan dekorator abstractmethod dan mensubkelaskan dari ABC. Dengan melakukan ini, programmer dapat meletakkan dasar bagi kelas lain dengan mendefinisikan metode yang perlu digunakan.
Berikut prosedur menyeluruh, langkah demi langkah:
- Impor modul yang diperlukan: Mulailah dengan mengimpor
ABCdanabstractmethoddari modulABC. Alat ini diperlukan untuk mendefinisikan kelas dan metode abstrak. - Bangun kelas berbasis
ABC: Buat kelas baru dan tetapkanABCsebagai induknya. Pewarisan ini menunjukkan bahwa kelas tersebut bersifat abstrak dan tidak dapat diinstansiasi secara langsung. - Definisikan metode abstrak menggunakan
@abstractmethod: Gunakan dekorator@abstractmethoduntuk menentukan metode mana yang harus ditimpa oleh subkelas. Pada dasarnya, metode-metode ini berfungsi sebagai placeholder, menjamin bahwa semua kelas turunan menjalankan operasi yang diperlukan.
Contoh langkah demi langkah mendefinisikan kelas abstrak
Berikut contoh praktis untuk mendemonstrasikan:
from abc import ABC, abstractmethod
class Vehicle(ABC):
@abstractmethod
def start_engine(self):
pass
@abstractmethod
def stop_engine(self):
pass
class Car(Vehicle):
def start_engine(self):
print("Car engine started")
def stop_engine(self):
print("Car engine stopped")
# Instantiating the abstract class directly will raise an error
# vehicle = Vehicle()
car = Car()
car.start_engine()
car.stop_engine()
# Car engine started
# Car engine stopped
Ini menjamin bahwa fungsi start_engine dan stop_engine diimplementasikan oleh subkelas apa pun dari Vehicle.
Contoh praktis: implementasi kelas abstrak
Perhatikan ilustrasi yang lebih mendalam menggunakan kelas Vehicle:
from abc import ABC, abstractmethod
class Vehicle(ABC):
def __init__(self, brand):
self.brand = brand
@abstractmethod
def start_engine(self):
pass
@abstractmethod
def stop_engine(self):
pass
class Motorcycle(Vehicle):
def start_engine(self):
print(f"{self.brand} motorcycle engine started")
def stop_engine(self):
print(f"{self.brand} motorcycle engine stopped")
motorcycle = Motorcycle("Yamaha")
motorcycle.start_engine()
motorcycle.stop_engine()
# Yamaha motorcycle engine started
# Yamaha motorcycle engine stopped
Ini mengilustrasikan bagaimana kelas abstrak memungkinkan fleksibilitas implementasi sekaligus menegakkan antarmuka yang konsisten.
Contoh Abstract Base Class Python
Sekarang setelah kita melihat bagaimana kelas dasar abstrak mendefinisikan kontrak bagi subkelas, mari jelajahi bagaimana kelas konkret memenuhi persyaratan ini dengan mengimplementasikan semua metode abstrak.
Kelas konkret yang mewarisi dari kelas abstrak
Subkelas yang mengimplementasikan setiap metode abstrak dari kelas abstrak disebut kelas konkret. Ini berarti kelas konkret menyediakan implementasi spesifik untuk semua metode yang diperlukan, sehingga memenuhi kontrak yang ditetapkan oleh kelas abstrak.
Contohnya:
from abc import ABC, abstractmethod
class Appliance(ABC):
@abstractmethod
def turn_on(self):
pass
@abstractmethod
def turn_off(self):
pass
class WashingMachine(Appliance):
def turn_on(self):
print("Washing machine is now ON")
def turn_off(self):
print("Washing machine is now OFF")
machine = WashingMachine()
machine.turn_on()
machine.turn_off()
# Washing machine is now ON
# Washing machine is now OFF
Membuat instance dan menegakkan aturan
Python mencegah Anda langsung menginstansiasi kelas abstrak. Ini adalah aspek penting dari kelas abstrak karena memastikan subkelas mana pun yang dibuat dari kelas abstrak akan mematuhi kontrak yang diperlukan sebagaimana ditetapkan oleh metode abstraknya.
Misalnya, TypeError akan muncul jika Anda mencoba menginstansiasi appliance = Appliance()
Pembatasan ini menjamin bahwa kelas abstrak hanya berfungsi sebagai cetak biru dan tidak disalahgunakan. Python mengizinkan pembuatan instance dari WashingMachine sambil mempertahankan kontrak yang ditentukan dalam Appliance dengan mengimplementasikan semua metode abstrak di WashingMachine. Dengan menjamin bahwa setiap fitur yang ditetapkan dalam kelas abstrak sepenuhnya diimplementasikan dalam subkelas konkretnya, penegakan ini meningkatkan integritas basis kode.
Properti Abstrak dan Inisialisasi
Dengan dasar ini, mari selami lebih dalam bagaimana Python mendukung properti abstrak menggunakan dekorator @property dan @abstractmethod, sehingga pengembang dapat menegakkan konsistensi atribut bersamaan dengan metode.
Menggunakan properti abstrak di Python
Selain metode, kelas abstrak dapat menentukan properti yang harus diimplementasikan oleh subkelas. Fitur ini memungkinkan pengembang memberlakukan antarmuka seragam untuk properti yang harus dideklarasikan oleh subkelas selain metode.
Untuk menjamin setiap subkelas menyediakan implementasinya, properti abstrak dapat ditentukan menggunakan dekorator @property bersama @abstractmethod. Pendekatan ini sangat membantu saat membuat kelas yang memerlukan atribut hanya-baca atau terhitung yang esensial bagi operasi kelas.
Contoh: kelas abstrak dengan properti
Berikut contohnya:
from abc import ABC, abstractmethod
class Animal(ABC):
@property
@abstractmethod
def sound(self):
pass
class Bird(Animal):
@property
def sound(self):
return "Chirp"
bird = Bird()
print(bird.sound)
# Chirp
Ketentuan dalam kelas abstrak Animal dipenuhi oleh properti sound pada kelas Bird.
Kapan Menggunakan Kelas Abstrak Python
Kelas abstrak ideal untuk skenario seperti:
- Saat merancang framework atau library di mana perilaku tertentu perlu ditegakkan: Dalam sistem yang kompleks, kelas abstrak dapat menetapkan seperangkat pedoman atau antarmuka terpadu yang harus dipatuhi semua subkelas, menjamin konsistensi dan mengurangi kesalahan.
- Menerapkan API yang konsisten di berbagai kelas: Dengan mendefinisikan metode abstrak, pengembang dapat memastikan bahwa semua kelas turunan menawarkan cara yang terstandar dan dapat diprediksi untuk berkomunikasi dengan aplikasi atau library.
- Menyediakan kerangka dasar untuk hierarki kelas: Kelas abstrak dapat menjadi panduan untuk membuat hierarki kelas yang saling terkait. Dengan mengizinkan kustomisasi di subkelas dan memungkinkan pengembang mendeklarasikan perilaku serta karakteristik bersama di kelas abstrak, struktur ini mendorong penggunaan kembali dan meminimalkan duplikasi.
Praktik terbaik
Gunakan kelas abstrak ketika perlu menetapkan kontrak yang jelas untuk subkelas. Kelas abstrak berguna saat Anda perlu menerapkan struktur atau perilaku tertentu pada beberapa kelas turunan. Kelas ini membantu memastikan setiap subkelas mengikuti desain standar, yang meningkatkan prediktabilitas kode dan mempermudah pemeliharaan.
Jika setiap metode dapat memiliki implementasi default, jangan gunakan kelas abstrak. Dalam situasi tertentu, kelas dasar konkret bisa menjadi opsi yang lebih baik untuk mengurangi kompleksitas sambil tetap menjaga kemampuan penggunaan kembali fungsionalitas bersama.
Pastikan kelas abstrak jelas dan sederhana, hanya mendefinisikan atribut dan metode yang paling penting. Kelas abstrak dengan terlalu banyak persyaratan bisa sulit dibangun dan dipelihara. Sebagai gantinya, fokuslah pada aspek-aspek esensial yang harus dimiliki kelas turunan.
Kesimpulan
Kelas abstrak termasuk dalam peralatan OOP Python, yang merupakan alat ampuh yang memungkinkan programmer membuat program yang andal dan mudah dipelihara. Anda dapat mendorong kejelasan, kemampuan penggunaan kembali, dan kemampuan perluasan dalam aplikasi dengan mendefinisikan kelas abstrak dan menegakkan antarmuka seragam di seluruh subkelas dengan bantuan modul ABC. Menulis kode yang lebih baik dan lebih andal dapat dicapai dengan menerapkan kelas abstrak, terlepas dari ukuran sistem yang Anda kerjakan.
Baik Anda sedang merancang program berorientasi objek yang andal, menegakkan antarmuka yang konsisten, atau membuat aplikasi yang skalabel, menguasai kelas abstrak Python akan meningkatkan kemampuan Anda menulis kode yang efisien dan mudah dipelihara. Tingkatkan pengetahuan Python Anda hari ini dengan jalur keterampilan Python Fundamentals kami yang komprehensif.
FAQ Kelas Abstrak Python
Bagaimana Anda mendefinisikan metode abstrak di Python?
Metode abstrak didefinisikan menggunakan dekorator @abstractmethod dari modul abc. Metode ini berfungsi sebagai placeholder dan harus ditimpa oleh subkelas mana pun.
Dapatkah Anda menginstansiasi kelas abstrak di Python?
Tidak, Anda tidak dapat menginstansiasi kelas abstrak secara langsung. Python akan menampilkan TypeError jika Anda mencoba membuat objek dari kelas abstrak.
Apa tujuan modul `abc` di Python?
Modul abc menyediakan kelas ABC dan dekorator abstractmethod untuk mendefinisikan dan menegakkan kelas serta metode abstrak di Python.
Dapatkah kelas abstrak memiliki metode reguler (konkret)?
Ya, kelas abstrak dapat memiliki metode konkret dengan implementasi. Metode-metode ini dapat diwarisi dan digunakan oleh subkelas.

