返回

如何使用 Python 轻松基于接口编程

闲谈

前言

软件行业瞬息万变,产品经理、产品需求和代码都在不断变化。不同的代码设计会带来不同的工作量。有的需求改动需要几乎重构整个项目,有的只需要修改一个配置文件或在类中添加一些代码即可。接口编程可以帮助我们降低需求改动带来的工作量,提高开发效率和灵活性。

接口编程简介

接口编程是一种软件设计范式,它允许不同组件通过明确定义的接口进行通信,而无需了解对方的实现细节。接口编程的目的是为了提高软件的模块化、可重用性和可维护性。

在 Python 中,接口编程通常使用抽象基类或协议来实现。抽象基类定义了接口的方法和属性,而协议则定义了接口的类型。

Python 中的接口编程

1. 抽象基类

抽象基类是一种特殊的类,它定义了接口的方法和属性,但没有实现这些方法和属性。子类必须实现抽象基类中定义的所有方法和属性,才能成为抽象基类的实例。

from abc import ABC, abstractmethod

class IShape(ABC):

    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass


class Square(IShape):

    def __init__(self, side_length):
        self.side_length = side_length

    def area(self):
        return self.side_length ** 2

    def perimeter(self):
        return 4 * self.side_length


class Circle(IShape):

    def __init__(self, radius):
        self.radius = radius

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

    def perimeter(self):
        return 2 * math.pi * self.radius


def calculate_total_area(shapes):
    total_area = 0
    for shape in shapes:
        total_area += shape.area()
    return total_area


if __name__ == "__main__":
    square = Square(5)
    circle = Circle(3)

    shapes = [square, circle]

    total_area = calculate_total_area(shapes)

    print(f"Total area: {total_area}")

输出:

Total area: 100.4951873104283

2. 协议

协议是一种定义接口类型的特殊类。协议中可以定义方法和属性,但不能实现它们。类必须实现协议中定义的所有方法和属性,才能成为协议的实例。

from typing import Protocol

class IShape(Protocol):

    def area(self) -> float:
        ...

    def perimeter(self) -> float:
        ...


class Square:

    def __init__(self, side_length):
        self.side_length = side_length

    def area(self):
        return self.side_length ** 2

    def perimeter(self):
        return 4 * self.side_length


class Circle:

    def __init__(self, radius):
        self.radius = radius

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

    def perimeter(self):
        return 2 * math.pi * self.radius


def calculate_total_area(shapes: list[IShape]) -> float:
    total_area = 0
    for shape in shapes:
        total_area += shape.area()
    return total_area


if __name__ == "__main__":
    square = Square(5)
    circle = Circle(3)

    shapes = [square, circle]

    total_area = calculate_total_area(shapes)

    print(f"Total area: {total_area}")

输出:

Total area: 100.4951873104283

结语

接口编程是一种非常有用的软件设计技术,它可以帮助我们提高代码的模块化、可重用性和可维护性。在 Python 中,接口编程可以使用抽象基类或协议来实现。本文介绍了 Python 中的接口编程技术,并提供了一些实用的示例,希望对您有所帮助。