Giao diện

Lập trình Hướng đối tượng Nâng cao với Python

Jake Roach

Data Engineer

Giao diện

Một loại lớp đặc biệt chỉ gồm các phương thức trừu tượng để tạo hợp đồng với các lớp triển khai giao diện

  • Phải định nghĩa các phương thức trừu tượng
  • Khung (skeleton) định nghĩa phương thức
  • Tham số không cần khớp
  • Chính thức hoặc không chính thức

$$

$$

Bắt đầu với giao diện không chính thức!

Sơ đồ một giao diện Python với ba phương thức trừu tượng.

Lập trình Hướng đối tượng Nâng cao với Python

Giao diện không chính thức với duck typing

class Course:
    def assign_homework(self, assignment_number, due_date):
        # Typically, the pass keyword will be used when creating an interface
        pass  

    def grade_assignment(self, assignment_number):
        pass
  • Duck typing
  • Phương thức trừu tượng assign_homework()grade_assignment()
Lập trình Hướng đối tượng Nâng cao với Python

Giao diện không chính thức với duck typing

class ProgrammingCourse:
    def __init__(self, course_name):
        self.course_name = course_name

    def assign_homework(self, due_date):
        # Some implementation of assign_homework here...

    def grade_assignment(self, assignment_number):
        # Some implementation of grade_assignment here...
Lập trình Hướng đối tượng Nâng cao với Python

Giao diện chính thức với ABC, @abstractmethod

from abc import ABC, abstractmethod

class Course(ABC):    
    @abstractmethod
    def assign_homework(self, assignment_number, due_date):
        pass

    @abstractmethod
    def grade_assignment(self, assignment_number):
        pass

Giao diện chính thức khác gì so với lớp cơ sở trừu tượng?

Lập trình Hướng đối tượng Nâng cao với Python

Giao diện vs. Lớp cơ sở trừu tượng

Giao diện (Interface)

  • Định nghĩa “hợp đồng” với các lớp triển khai nó
  • Những việc “phải làm”
  • Chính thức và không chính thức
  • Chỉ chứa phương thức trừu tượng (không có phương thức cụ thể)
  • Các lớp gần như giống hệt nhau

Lớp cơ sở trừu tượng (ABC)

  • Tạo “bản thiết kế” cho các lớp có đặc điểm chung
  • Quan hệ “là-một” (is-a)
  • Thường chỉ chính thức
  • Pha trộn phương thức trừu tượng và cụ thể
  • Các lớp trông và hoạt động tương tự
Lập trình Hướng đối tượng Nâng cao với Python

Triển khai một giao diện chính thức

class ProgrammingCourse(Course):
    def __init__(self, course_name):
        self.course_name = course_name

    def assign_homework(self, due_date):
        # Some implementation of assign_homework here...

    def grade_assignment(self, assignment_number):
        # Some implementation of grade_assignment here...

intermediate_oop = ProgrammingCourse("Intermediate Object-Oriented Programming")
Lập trình Hướng đối tượng Nâng cao với Python

Không triển khai đủ một giao diện chính thức

class ProgrammingCourse(Course):
    def __init__(self, course_name):
        self.course_name = course_name

    def assign_homework(self, due_date):
        # Some implementation of assign_homework here...

intermediate_oop = ProgrammingCourse("Intermediate Object-Oriented Programming")
 ...
    intermediate_oop = ProgrammingCourse("Intermediate Object-Oriented Programming")
TypeError: Can't instantiate abstract class ProgrammingCourse with abstract method
    grade_assignment
Lập trình Hướng đối tượng Nâng cao với Python

Ayo berlatih!

Lập trình Hướng đối tượng Nâng cao với Python

Preparing Video For Download...