Tôi có nên sử dụng các lớp trừu tượng trong python không

Lớp trừu tượng là một khái niệm rất quan trọng của lập trình hướng đối tượng. Đó là một thực hành tốt về nguyên tắc DRY (Don't Repeat Yourself). Trong một dự án lớn, việc sao chép mã xấp xỉ bằng với việc sử dụng lại lỗi và một nhà phát triển không thể nhớ chi tiết tất cả các lớp. Do đó, sẽ rất hữu ích khi sử dụng một lớp trừu tượng để định nghĩa một giao diện chung cho các triển khai khác nhau

Các lớp trừu tượng là các lớp chứa một hoặc nhiều phương thức trừu tượng. Một phương thức trừu tượng là một phương thức được khai báo, nhưng không chứa phần thực thi. Các lớp trừu tượng không thể được khởi tạo và yêu cầu các lớp con cung cấp các triển khai cho các phương thức trừu tượng

Bạn có thể thấy điều này trong các ví dụ sau

class AbstractClass:
    
    def do_something(self):
        pass
    
    
class B(AbstractClass):
    pass

a = AbstractClass()
b = B()

Nếu chúng ta bắt đầu chương trình này, chúng ta sẽ thấy rằng đây không phải là một lớp trừu tượng, bởi vì

  • chúng ta có thể khởi tạo một thể hiện từ
  • chúng tôi không bắt buộc phải triển khai do_something trong định nghĩa lớp của B

Ví dụ của chúng tôi đã triển khai một trường hợp kế thừa đơn giản không liên quan gì đến một lớp trừu tượng. Trên thực tế, bản thân Python không cung cấp các lớp trừu tượng. Tuy nhiên, Python đi kèm với một mô-đun cung cấp cơ sở hạ tầng để xác định Lớp cơ sở trừu tượng (ABC). Mô-đun này được gọi là - vì những lý do rõ ràng - abc

Tôi có nên sử dụng các lớp trừu tượng trong python không

Đoạn mã Python sau sử dụng mô-đun abc và định nghĩa một lớp cơ sở trừu tượng

from abc import ABC, abstractmethod
 
class AbstractClassExample(ABC):
 
    def __init__(self, value):
        self.value = value
        super().__init__()
    
    @abstractmethod
    def do_something(self):
        pass

Bây giờ chúng ta sẽ định nghĩa một lớp con bằng cách sử dụng lớp trừu tượng đã định nghĩa trước đó. Bạn sẽ nhận thấy rằng chúng tôi chưa triển khai phương thức do_something, mặc dù chúng tôi bắt buộc phải triển khai nó, bởi vì phương thức này được trang trí như một phương thức trừu tượng với trình trang trí "abstractmethod". Chúng tôi nhận được một ngoại lệ là không thể khởi tạo DoAdd42

class DoAdd42(AbstractClassExample):
    pass

x = DoAdd42(4)

ĐẦU RA

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-2bcc42ab0b46> in <module>
      2     pass
      3 
----> 4 x = DoAdd42(4)
TypeError: Can't instantiate abstract class DoAdd42 with abstract methods do_something

Chúng ta sẽ làm đúng cách trong ví dụ sau, trong đó chúng ta định nghĩa hai lớp kế thừa từ lớp trừu tượng của chúng ta

class DoAdd42(AbstractClassExample):

    def do_something(self):
        return self.value + 42
    
class DoMul42(AbstractClassExample):
   
    def do_something(self):
        return self.value * 42
    
x = DoAdd42(10)
y = DoMul42(10)

print(x.do_something())
print(y.do_something())

ĐẦU RA

52
420

Một lớp bắt nguồn từ một lớp trừu tượng không thể được khởi tạo trừ khi tất cả các phương thức trừu tượng của nó bị ghi đè

Bạn có thể nghĩ rằng các phương thức trừu tượng không thể được triển khai trong lớp cơ sở trừu tượng. ấn tượng này là sai. Một phương thức trừu tượng có thể có một triển khai trong lớp trừu tượng. Ngay cả khi chúng được triển khai, người thiết kế các lớp con sẽ buộc phải ghi đè việc triển khai. Giống như trong các trường hợp kế thừa "bình thường" khác, phương thức trừu tượng có thể được gọi bằng cơ chế gọi super(). Điều này cho phép cung cấp một số chức năng cơ bản trong phương thức trừu tượng, có thể được làm phong phú thêm bằng cách triển khai lớp con

Các lớp trừu tượng có hữu ích trong Python không?

Tầm quan trọng của các lớp trừu tượng . Vì vậy, chúng tôi có thể đảm bảo rằng các lớp của chúng tôi tuân theo cấu trúc và triển khai tất cả các phương thức trừu tượng được định nghĩa trong lớp trừu tượng của chúng tôi. if our subclasses don't follow that blueprint, Python will give an error. Thus we can make sure that our classes follow the structure and implement all the abstract methods defined in our abstract class.

Bạn có nên sử dụng lớp trừu tượng?

Một lớp trừu tượng là một lựa chọn tuyệt vời nếu bạn tính đến khái niệm kế thừa vì nó cung cấp cách triển khai lớp cơ sở chung cho các lớp dẫn xuất. Một lớp trừu tượng cũng tốt nếu bạn muốn khai báo các thành viên không công khai. Trong một giao diện, tất cả các phương thức phải được công khai.

Một số lợi thế của việc tạo các lớp trừu tượng Python là gì?

Trong Python, các lớp cơ sở trừu tượng cung cấp bản thiết kế cho các lớp cụ thể . Chúng không chứa triển khai. Thay vào đó, chúng cung cấp một giao diện và đảm bảo rằng các lớp cụ thể dẫn xuất được triển khai đúng cách.

Sử dụng giao diện hay lớp trừu tượng tốt hơn?

Bạn nên sử dụng giao diện nếu muốn ký hợp đồng về một số hành vi hoặc chức năng . Bạn không nên sử dụng giao diện nếu bạn cần viết cùng mã cho các phương thức giao diện. Trong trường hợp này, bạn nên sử dụng một lớp trừu tượng, định nghĩa phương thức một lần và sử dụng lại nếu cần.