接口

Python 面向对象编程进阶

Jake Roach

Data Engineer

接口

一种只由抽象方法组成的特殊类,与实现它的类形成一个"合同"

  • 必须实现抽象方法
  • 方法定义骨架
  • 参数可不完全匹配
  • 可正式或非正式

$$

$$

先从非正式接口开始!

一个包含三个抽象方法的 Python 接口示意图。

Python 面向对象编程进阶

用鸭子类型实现非正式接口

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
  • 鸭子类型
  • assign_homework()grade_assignment() 为抽象方法
Python 面向对象编程进阶

用鸭子类型实现非正式接口

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...
Python 面向对象编程进阶

使用 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

正式接口与抽象基类有何不同?

Python 面向对象编程进阶

接口 vs. 抽象基类

接口

  • 与实现它的类约定"合同"
  • "必须做"的清单
  • 正式或非正式
  • 只包含抽象方法(无具体方法)
  • 适用于几乎相同的类

抽象基类

  • 为具共同特征的类创建"蓝图"
  • "是一个"关系
  • 通常仅正式
  • 抽象方法与具体方法混合
  • 适用于看起来/行为相似的类
Python 面向对象编程进阶

实现正式接口

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")
Python 面向对象编程进阶

未实现正式接口的失败案例

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
Python 面向对象编程进阶

让我们练习吧!

Python 面向对象编程进阶

Preparing Video For Download...