OOP Python - Interface

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.

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