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 资源
通过相关的交互式教程、备忘单和代码比较来扩展您的知识。