Python鸭子多态

张开发
2026/4/17 6:39:17 15 分钟阅读

分享文章

Python鸭子多态
在 Python 中“鸭子多态”通常指的是通过鸭子类型实现的多态行为。它不是一种独立的技术而是 Python 动态类型特性带来的编程风格。核心概念鸭子类型“如果它走路像鸭子叫起来像鸭子那么它就是鸭子。”在 Python 中一个对象的适用性取决于它是否具有所需的方法和属性而不是它的实际类型。不需要显式继承同一个父类或实现同一个接口。与静态语言多态的区别静态语言如 Java/CPython鸭子类型多态依赖继承或接口实现多态依赖对象行为方法存在即可必须显式声明类型关系运行时动态检查方法类型检查在编译期完成类型检查在运行时进行AttributeError简单示例classDuck:defquack(self):print(嘎嘎嘎)classPerson:defquack(self):print(我在模仿鸭子叫嘎嘎嘎)classDog:defbark(self):print(汪汪汪)defmake_it_quack(thing):不关心 thing 是什么类型只关心它能不能 quackthing.quack()# 使用duckDuck()personPerson()dogDog()make_it_quack(duck)# 输出嘎嘎嘎make_it_quack(person)# 输出我在模仿鸭子叫嘎嘎嘎# make_it_quack(dog) # 报错 AttributeError因为 Dog 没有 quack 方法优点与注意事项优点代码极其灵活减少样板代码无需为了复用而强行继承鼓励编写基于“协议”如__iter__、__len__的通用代码注意事项也是缺点运行时错误风险如果传入的对象没有所需方法会在运行时抛出AttributeError可读性降低需要依靠文档或注释说明函数期望的“隐式接口”常见的“鸭子协议”举例Python 内置的很多功能都依赖鸭子类型例如可迭代对象只要定义了__iter__()或__getitem__()for循环就能处理它。上下文管理器只要定义了__enter__()和__exit__()就能用with语句。文件类对象只要实现了read()/write()就能传给json.load()等函数。这种“行为决定身份”的思想正是 Python 多态的精髓。

更多文章