面向对象编程:多态与鸭子类型
知识点思维导图
核心概念笔记
多态 (Polymorphism)
-
定义: 调用不同对象的同名方法,能够实现不同的功能。
-
实现条件:
- 继承: 必须有继承关系(子类继承父类)。
- 重写: 子类必须重写父类的方法。
- 调用: 提供公共接口(函数)传入对象,调用对象的同名方法。
运行结果:
鸭子类型 (Duck Typing)
- 定义: Python 特有的多态机制。“如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子。”
- 特点: 不关心对象的类型(是否是某类的子类),只关心对象是否拥有特定的方法(行为)。
- 优势: 更加灵活,解耦了类之间的继承关系。
运行结果
代码实现示例
# ==========================================
# 1. 传统多态 (基于继承)
# ==========================================
class Animal(object):
def speak(self):
print("动物拥有说话的能力")
class Dog(Animal):
# 子类重写父类方法
def speak(self):
print("汪汪汪")
class Cat(Animal):
# 子类重写父类方法
def speak(self):
print("喵喵喵")
# 公共接口:利用多态
def animal_speak(obj):
obj.speak()
# 测试调用
animal = Animal()
dog = Dog()
cat = Cat()
animal_speak(animal) # 输出: 动物拥有说话的能力
animal_speak(dog) # 输出: 汪汪汪
animal_speak(cat) # 输出: 喵喵喵
print("---------鸭子类型:---------")
# ==========================================
# 2. 鸭子类型 (基于行为)
# ==========================================
class Alipay(object):
def pay(self, amount):
print(f"支付宝支付了{amount}元")
class Wechatpay(object):
def pay(self, amount):
# 注意:原代码此处文案可能有误,逻辑上应为微信支付
print(f"微信支付了{amount}元")
class Creditpay(object):
def pay(self, amount):
print(f"信用卡支付了{amount}元")
# 公共接口:不检查类型,只检查是否有 pay 方法
def payment(obj):
obj.pay(100)
# 测试调用
alipay = Alipay()
wechatpay = Wechatpay()
creditpay = Creditpay()
payment(alipay) # 输出: 支付宝支付了100元
payment(wechatpay) # 输出: 微信支付了100元
payment(creditpay) # 输出: 信用卡支付了100元
print("------------------------")