MST

星途 面试题库

面试题:Python中抽象类与接口的基本使用

请简述Python中抽象类的定义方式,并举例说明如何定义一个抽象类以及包含抽象方法。同时,说明Python中没有传统接口概念,在实际场景中如何模拟接口的功能?
28.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. Python中抽象类的定义方式

在Python中,定义抽象类需要使用abc模块(Abstract Base Classes)。abc模块提供了定义抽象基类的基础设施。

2. 定义一个抽象类以及包含抽象方法的示例

from abc import ABC, abstractmethod


class Shape(ABC):
    @abstractmethod
    def area(self):
        pass


class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height


class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        import math
        return math.pi * self.radius * self.radius


3. 模拟接口功能

在Python中,虽然没有传统意义上的接口概念,但可以通过抽象类和抽象方法来模拟接口的功能。

  • 抽象类和抽象方法:像上面示例中的Shape抽象类,强制子类必须实现area方法,这就类似接口定义的契约,子类必须遵守。
  • 多重继承:可以通过多重继承多个只包含抽象方法的抽象类,来实现类似接口多继承的效果。例如:
from abc import ABC, abstractmethod


class Printable(ABC):
    @abstractmethod
    def print_info(self):
        pass


class Serializable(ABC):
    @abstractmethod
    def serialize(self):
        pass


class MyClass(Printable, Serializable):
    def print_info(self):
        print("Info about MyClass")

    def serialize(self):
        return "Serialized data of MyClass"


  • 使用协议(Protocols):Python 3.8 引入了typing.Protocol,它允许定义结构类型(structural typing),在运行时不强制检查,但在类型检查时能提供类似接口的功能。例如:
from typing import Protocol


class Writeable(Protocol):
    def write(self, data):
        pass


class FileWriter:
    def write(self, data):
        with open('file.txt', 'w') as f:
            f.write(data)


def write_to(w: Writeable, data):
    w.write(data)


file_writer = FileWriter()
write_to(file_writer, "Some data")


在这个例子中,Writeable协议定义了write方法,只要类实现了这个方法,就可以被视为符合Writeable协议,类似接口的行为。