Python OOP 多态性:鸭子类型和接口

掌握 Python 中的多态性。了解如何使用鸭子类型、方法重写和抽象基类编写灵活、松散耦合的代码。

在编辑器中尝试

概述

多态性是一个希腊术语,意思是“多种形式”。在面向对象编程中,它指的是不同类以自己独特的方式响应相同方法调用的能力。多态性允许您编写一个可以处理许多不同类型的对象的函数,前提是它们共享一个公共接口。这可以实现低耦合,并使您的软件系统具有高度适应性且易于扩展。

在 Python 中,多态性与鸭子类型 (Duck Typing) 的概念密切相关。这个术语来源于这样一句话:“如果它走起来像鸭子,嘎嘎叫起来像鸭子,那么它一定是鸭子。”在动态类型的 Python 中,函数并不关心对象属于哪个类;它只关心对象属于哪个类。它只关心该对象是否实现了请求的方法。例如,如果您有一个调用“.speak()”的函数,您可以向它传递一只狗、一只猫或一个机器人——只要它们都有一个“.speak()”方法,代码就可以完美运行。

对于更严格的架构,Python 通过内置的“abc”模块提供抽象基类(ABC)。通过继承“abc.ABC”并使用“@abstractmethod”装饰器,您可以定义强制子类实现的正式接口。如果子类未能定义抽象方法,当您尝试实例化它时,Python 将引发 TypeError。平衡灵活的鸭子类型与正式的抽象类是设计弹性 Python 库的一项关键技能。

代码和执行输出

实现表示计算面积的形状的多态类。

polymorphism_demo.py
在编辑器中尝试
from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        """Must be implemented by subclasses."""
        pass

class Square(Shape):
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side * self.side

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        import math
        return math.pi * (self.radius ** 2)

# Polymorphic function accepting any Shape
def print_area(shape: Shape):
    print(f"Calculated Area: {shape.area():.2f}")

print_area(Square(4))
print_area(Circle(3))
端子输出
Calculated Area: 16.00
Calculated Area: 28.27

逐步实施

  • 编写处理 CreditCard、PayPal 和 Stripe 对象的支付处理器
  • 使用统一的渲染循环绘制各种元素(文本、图像)
  • 在单元测试期间模拟外部 API 连接

常见问题解答

什么是鸭子打字?

它是Python 的多态性动态方法。它在运行时检查方法和属性是否存在,而不是验证来自特定父类的继承。

你能实例化一个抽象基类吗?

不可以。尝试实例化继承自 ABC 并包含抽象方法的类将引发 TypeError。

相关主题

推荐的 Python 资源

通过相关的交互式教程、备忘单和代码比较来扩展您的知识。