Abstract classes là một khái niệm trong lập trình hướng đối tượng, cho phép định nghĩa một lớp cha trừu tượng và các phương thức trừu tượng, mà không cần cung cấp triển khai cho chúng.
Cú pháp khai báo một abstract class trong Python sử dụng module abc như sau:
from abc import ABC, abstractmethod
class AbstractClass(ABC):
@abstractmethod
def do_something(self):
pass
Trong đó, ABC
là một lớp abstract class, abstractmethod
là một decorator được sử dụng để khai báo phương thức trừu tượng.
Dưới đây là 3 ví dụ về abstract classes:
– Abstract class với phương thức trừu tượng:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
# Không thể khởi tạo đối tượng từ abstract class
# shape = Shape()
rect = Rectangle(5, 10)
print(rect.area())
circle = Circle(5)
print(circle.area())
Trong ví dụ này, Shape
là abstract class với phương thức trừu tượng area()
, Rectangle
và Circle
là các lớp kế thừa từ Shape
và ghi đè phương thức area()
.
– Abstract class không có phương thức trừu tượng:
from abc import ABC
class Animal(ABC):
def eat(self):
print("I am eating")
class Cat(Animal):
def meow(self):
print("Meow")
class Dog(Animal):
def bark(self):
print("Bark")
cat = Cat()
cat.eat()
cat.meow()
dog = Dog()
dog.eat()
dog.bark()
Trong ví dụ này, Animal
là abstract class, không có phương thức trừu tượng. Cat
và Dog
là các lớp kế thừa từ Animal
.
– Kế thừa từ nhiều abstract class:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Color(ABC):
@abstractmethod
def fill_color(self):
pass
class Rectangle(Shape, Color):
def __init__(self, length, width, color):
self.length = length
self.width = width
self.color = color
def area(self):
return self.length * self.width
def fill_color(self):
return f"The rectangle is filled with {self.color} color."
Trong ví dụ này, chúng ta định nghĩa hai abstract class là Shape
và Color
, mỗi class đều có một phương thức abstract. Shape
có phương thức abstract area()
và Color
có phương thức abstract fill_color()
.
Sau đó, chúng ta định nghĩa class Rectangle
kế thừa từ cả hai abstract class Shape
và Color
. Lớp này có các thuộc tính length
, width
, color
và triển khai phương thức area()
để tính diện tích của hình chữ nhật và phương thức fill_color()
để điền màu sắc cho hình chữ nhật.
Thông qua kế thừa từ hai abstract class, chúng ta có thể đảm bảo rằng Rectangle
class đã triển khai đầy đủ các phương thức abstract của Shape
và Color
.