在 Python 中,多态(Polymorphism) 是面向对象编程(OOP)的三大核心特性之一(另外两个是封装和继承),多态允许不同类的对象对同一消息做出不同的响应。
Python 是一种动态类型语言,因此它天然支持“鸭子类型”(Duck Typing),这是实现多态的一种主要方式,Python 也支持通过抽象基类(ABC)或接口来实现更严格的多态。
什么是多态?
多态意味着“多种形态”,在编程中,它指的是:
同一个接口或方法名,在不同的类中有不同的实现。
class Dog:
def speak(self):
return "Woof!"
class Cat:
def speak(self):
return "Meow!"
def make_it_speak(animal):
print(animal.speak()) # 多态:根据传入对象的不同,调用不同的实现
make_it_speak(Dog()) # 输出: Woof!
make_it_speak(Cat()) # 输出: Meow!
这里 make_it_speak 函数不关心传入的是 Dog 还是 Cat,只要对象有 speak() 方法即可,这就是多态。
Python 中实现多态的几种方式
鸭子类型(Duck Typing)最常用
Python 不强制要求类继承自某个基类,只要对象具有所需的方法或属性,就可以被使用。
class Bird:
def fly(self):
return "Flying..."
class Airplane:
def fly(self):
return "Taking off..."
def make_it_fly(thing):
print(thing.fly())
make_it_fly(Bird()) # Flying...
make_it_fly(Airplane()) # Taking off...
“如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子。”
继承 + 方法重写(Override)
子类继承父类并重写方法,实现多态。
class Shape:
def area(self):
raise NotImplementedError("Subclass must implement abstract method")
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
import math
return math.pi self.radius 2
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width self.height
def print_area(shape: Shape):
print(f"Area: {shape.area()}")
print_area(Circle(5)) # Area: 78.53981633974483
print_area(Rectangle(4, 6)) # Area: 24
使用抽象基类(ABC)强制多态
通过 abc 模块定义抽象类,确保子类必须实现特定方法。
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
# 如果子类没有实现 speak(),实例化时会报错
# class Bird(Animal): pass # TypeError: Can't instantiate abstract class Bird with abstract method speak
def make_it_speak(animal: Animal):
print(animal.speak())
make_it_speak(Dog()) # Woof!
make_it_speak(Cat()) # Meow!
多态的优势
- 代码复用:可以编写通用函数处理多种类型。
- 扩展性强:新增类无需修改现有代码(开闭原则)。
- 解耦:调用者不需要知道具体类型,只需知道接口。
注意事项
- Python 的多态是运行时多态,依赖动态类型检查。
- 没有编译时类型检查,因此需确保对象确实具有所需方法(可用
hasattr()或try-except防御)。 - 推荐使用类型提示(Type Hints)+ 静态检查工具(如
mypy)提高代码安全性。
from typing import Union
def make_it_speak(animal: Union[Dog, Cat]):
print(animal.speak())
| 方式 | 特点 | 适用场景 |
|---|---|---|
| 鸭子类型 | 灵活、无需继承 | 快速开发、简单场景 |
| 继承+方法重写 | 结构清晰、支持继承体系 | 有明确类层次结构 |
| 抽象基类(ABC) | 强制实现、类型安全 | 大型项目、接口规范 |
Python 的多态机制灵活且强大,开发者可根据项目需求选择合适的实现方式。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/481464.html



