【python高级】04_面向对象编程:多态与鸭子类型

0 阅读2分钟

面向对象编程:多态与鸭子类型

知识点思维导图

image.png

核心概念笔记

多态 (Polymorphism)

  • 定义:  调用不同对象的同名方法,能够实现不同的功能。

  • 实现条件:

    1. 继承:  必须有继承关系(子类继承父类)。
    2. 重写:  子类必须重写父类的方法。
    3. 调用:  提供公共接口(函数)传入对象,调用对象的同名方法。

image.png 运行结果:

image.png

鸭子类型 (Duck Typing)

  • 定义:  Python 特有的多态机制。“如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子。”
  • 特点:  不关心对象的类型(是否是某类的子类),只关心对象是否拥有特定的方法(行为)。
  • 优势:  更加灵活,解耦了类之间的继承关系。

image.png

运行结果

image.png

代码实现示例

# ==========================================
# 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("------------------------")