Abstract class và interface trong python

Trong bài này chúng ta sẽ tìm hiểu Interface trong Python, đây là kỹ thuật đóng vai trò rất quan trọng trong kỹ thuật phần mềm, nhất là việc quản lý mã code của Python.

Abstract class và interface trong python

Abstract class và interface trong python

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Có một số trường hợp bạn cần tạo ra nhiều class có những phương thức rất giống nhau, nhưng về cách tiếp cận thì có chút khác nhau, điều này có thể gây ra một số nhầm lẫn. Trong trường hợp này bạn có thể sử dụng Interface trong Python để giải quyết.

Lưu ý: Trong Python không có khái niệm interface, nên bài này mình chỉ muốn giải thích cho bạn hiểu ý nghĩa của interface mà thôi.

1. Interface trong Python là gì?

Interface là một bản thiết kế cho các class trong Python. Nó cũng là một class nhưng cách hoạt động khác với những class bình thường. Bạn có thể khai báo các phương thức bên trong interface, nhưng những phương thức này là trừu tượng (abstract), tức là chỉ khai báo chứ không xây dựng nội dung.

Bài viết này được đăng tại [free tuts .net]

Bạn có thể tưởng tượng Interface là một mẫu chuẩn thiết kế cho các loại nhà (đặt tên nó là A), và:

  • Mẫu nhà cấp 4 là một abstract class, bởi nó được triển khai từ A.
  • Mẫu nhà mái thái là một abstract class, bởi nó được triển khai từ A.

Cách tiếp cận Interface trong Python hơi khác so với các ngôn ngữ khác. Hầu hết những ngôn ngữ đó đều sử dụng từ khóa interface để định nghĩa, còn trong Python thì không có, bạn sẽ phải sử dụng một module tên là Abstract Base Classes (ABC) để tạo Interface.

2. Tại sao phải sử dụng Interface trong Python?

Để trả lời cho câu hỏi này thì ta hãy làm một ví dụ nhé.

Ví dụ: Thiết kế chương trình quản lý các loại động vật như chó, mèo, vịt.

Nhận xét: Đây đều là những loại động vật, nó có các hành động chung như di chuyển, ăn ... Vì vậy ta sẽ khai báo một interface Animal, sau đó abstract class sẽ implement (triểu khai) từ Animal.

class Animal:
    def move(self):
        pass

    def eat(self):
        pass

Bây giờ ta sẽ tạo một class Dog:

class Dog(Animal):
    def move(self):
        print("Con chó di chuyển 4 chân")
    def eat(self):
        print("Con chó ăn thịt")

Và đây là class Duck:

class Duck(Animal):
    def move(self):
        print("Con vịt di chuyển 2 chân")
    def eat(self):
        print("Con chó ăn cám")

Trong ví dụ này thì class Animal có thể được xem là một Interface, còn các class Dog và Duck được triển khai (implement) từ Animal.

3. Lời kết

Mình cũng không rõ tại sao Python lại không có khái niệm Interface. Có ý kiến cho rằng bản chất Python không cần interface bởi nó đã có đa kế thừa. Nhưng dù sao đi nữa thì đây vẫn là một ngôn ngữ có cấu trúc rất đặc biệt.

Abstract class và interface trong python

Đã đăng vào thg 6 18, 2019 4:28 CH 5 phút đọc

Hello everyone! Sau bao khó khăn thì chúng ta lại được gặp nhau mọi người nhỉ. Và như thường lệ, mình sẽ giới thiệu với mọi người về nội dung của bài viết ngày hôm nay. Ở bài viết trước mình đã trình bày với mọi người về Class và Object trong Python. Và hôm nay, để tiếp tục thì mình sẽ đưa mọi người đến với một loại class rất quan trọng đó là Abstract class (lớp trừu tượng). Are you ready? Here we go!

Abstract class là gì?

Một Abstract class có thể được coi là một bản thiết kế cho các class khác, cho phép bạn tạo một tập hợp các phương thức mà phải được tạo trong bất kỳ class con nào được xây dựng từ Abstract class của bạn. Một class có chứa một hoặc các phương thức abstract được gọi là một Abstract class. Một phương thức abstract là một phương thức có khai báo nhưng không có bất kỳ triển khai nào. Các Abstract class không thể khởi tạo và nó cần các class con để triển khai cho các phương thức abstract được định nghĩa trong các Abstract class.

Tại sạo phải sử dụng Abstract class?

Các Abstract class cho phép bạn cung cấp chức năng mặc định cho các class con. Bằng cách định nghĩa một abstract base class (lớp cơ sở trừu tượng), bạn có thể xây dựng nên một mô hình chung cho một nhóm các class con. Khả năng này đặc biệt hữu ích cho bạn khi làm việc trong một team lớn hoặc với dự án lớn, nơi mà bạn rất khó khăn hoặc không thể nào đưa mọi thứ vào trong một hoặc một nhóm các class nào đó. Lúc đó bạn cần có một mẫu class chung chứa các thứ cần thiết, sau đó thì chỉ cần implement nó vào để giải quyết thôi.

Abstract Base classes (ABC)

Mặc định trong Python sẽ không cung cấp Abstract class cho chúng ta sử dụng. Nhưng Python có một mô-đun gọi là Abstract Base Classes (ABC) để giúp chúng ta làm điều đó. Mô-đun này nằm trong package abc nên chúng ta cần import vào trước khi sử dụng.

from abc import ABC

Từ khóa @abstractmethod

Vì Abstract class là một class, nên các bạn có thể hoàn toàn khai báo thuộc tính và phương thức như một class bình thường. Và để khai báo được phương thức abstract thì các bạn cần import thêm mô-đun abstractmethod cùng với từ khóa @abstractmethod. Mô-đun này cũng nằm trong package abc nên các bạn có thể import như sau:

form abc import ABC, abstractmethod

Cú pháp khai báo Abstract class

form abc import ABC, abstractmethod
# câu này bắt buộc phải có nhé
class abstractClassName(ABC):
    [danh sách thuộc tính]
    [danh sách phương thức]
    @abstractmethod
    def methodName(self):
        pass

# tạo class thứ 2 implement từ abstractClassName
class normalClass(abstractClassName):
    # khai báo cho class ở đây

Trên đây là cú pháp khai báo một abstract class cơ bản. Ở đây mình dùng từ khóa @abstractmethod để khai báo rằng phương thức phía dưới là phương thức abstract. Cụ thể cách dùng các bạn có thể tham khảo ví dụ dưới đây.

Ví dụ minh họa

Kết luận

Như vậy là mình đã giới thiệu xong với các bạn một trong những class very very important trong Python rồi nhé. Qua đó mình xin tổng kết lại một số thứ như sau:

  • Đầu tiên, để có thể tạo một abstract class ta cần import 2 mô-đun là ABCabstractmethod trong package abc.
  • Dùng cú pháp class abstractClassName(ABC): để khai báo Abstract class.
  • Dùng từ khóa @abstractmethod để chỉ ra những phương thức abstract.
  • Dùng cú pháp class normalClassName(abstractClassName): để implement 1 Abstract class.
  • Cần phải định nghĩa lại phương thức abstract trong những class con được implement từ Abstract class.
  • Một Abstract class không phải là một class cụ thể, nó không thể được khởi tạo.

Cảm ơn các bạn đã cố gắng xem hết bài viết, chúc các bạn thành công.

All rights reserved