Python-多态

面向对象的三大特性:
1. 封装:封装是根据职责将属性和方法封装到一个抽象类中,是定义类的准则,在python面向对象基础语法面向对象封装案例中详细介绍过。
2. 继承:继承实现了代码的重用,相同的代码不需要重复的表现,同时当父类不能满足子类的需求时,可以在子类中对父类进行重新。 在 Python-继承单继承&多继承中介绍过。
3. 多态:多态实现了不同的子类对象调用相同的父类方法,可以产生不同的执行结果。例如下面的类图:人类是程序员和设计师类的父类,但是我们想要程序员类和设计师类中的work()方法执行不同的动作。
这里写图片描述
多态以继承和重写父类方法为前提,可以增加代码的灵活度,是调用方法的技巧,不会影响到类的内部设计。这篇文章中主要介绍一下多态的用法。

多态的例子

  1. 在Dog类中封装game的方法
  2. 在XiaoTianQuan类中封装game的方法,但是XiaoTianQuan类中game的方法和Dog类中game的方法不同
  3. 定义Person类,封装一个play_with_dog的方法,在方法内部,然后传入的对象调用game方法
    这里写图片描述
class Dog(object):

    def __init__(self, name):
        self.name = name

    def game(self):
        print("%s dog类的狗在玩" % self.name)


class XiaoTianQuan(Dog):

    # 重写狗类的方法
    def game(self):
        print("%s xiaotianquan类的狗在玩" % self.name)


class Person(object):

    def __init__(self, name):
        self.name = name

    def play_with_dog(self, dog):
        print("%s 和 %s 玩" % (self.name, dog.name))

        dog.game()

# 1. 创建狗对象
dog = Dog("dog")
xiaotianquan = XiaoTianQuan("xiaotianquan")

# 2. 创建小明对象
xm = Person("xiaoming")

# 3. 调用小明和狗玩的方法
xm.play_with_dog(dog)

xm.play_with_dog(xiaotianquan)

以上代码会在输出下面的信息:
这里写图片描述
Person类只需要让传入的对象调用game方法,而不需要关心是哪个类中的game方法。在执行程序时,传入不同的对象实参,就会产生不同的执行效果。多态更容易编写出通用的代码,作出通用的编程以适应需求的不断变化

Python 中,“`if` 多态”并不是一个标准术语,但可以从多态(Polymorphism)的核心思想出发,理解为根据对象的不同类型,在条件判断中实现不同的行为逻辑。Python 作为动态类型语言,结合了继承、方法重写与鸭子类型(Duck Typing),使得多态的实现更加灵活[^1]。 ### 1. 多态的基本实现方式 Python 中的多态主要通过继承和方法重写实现。不同子类可以重写父类的方法,从而在调用相同接口时表现出不同的行为。结合 `if` 条件判断,可以在运行时根据对象的实际类型决定执行哪段逻辑。 例如: ```python class Animal: def speak(self): pass class Dog(Animal): def speak(self): return "Woof!" class Cat(Animal): def speak(self): return "Meow!" def make_sound(animal): if isinstance(animal, Dog): print(animal.speak()) elif isinstance(animal, Cat): print(animal.speak()) else: print("Unknown animal") dog = Dog() cat = Cat() make_sound(dog) # 输出: Woof! make_sound(cat) # 输出: Meow! ``` 在上述代码中,`make_sound` 函数通过 `if` 判断传入对象的类型,并调用其对应的 `speak` 方法,实现了多态行为[^1]。 ### 2. 使用鸭子类型实现更灵活的多态 Python 的鸭子类型特性允许不通过类型判断,而是根据对象是否具有特定方法来执行操作。这种方式省去了 `if` 判断类型的过程,使代码更加简洁和灵活。 ```python def make_sound(animal): animal.speak() class Dog: def speak(self): return "Woof!" class Cat: def speak(self): return "Meow!" dog = Dog() cat = Cat() make_sound(dog) # 输出: Woof! make_sound(cat) # 输出: Meow! ``` 在这种实现中,函数 `make_sound` 不关心传入对象的类型,只要对象具有 `speak` 方法即可调用。这种方式体现了 Python 多态的灵活性。 ### 3. 抽象基类与接口实现 结合抽象基类(Abstract Base Class, ABC)可以强制子类实现某些方法,确保多态的一致性。这在大型项目中尤为有用。 ```python 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!" def make_sound(animal: Animal): print(animal.speak()) dog = Dog() cat = Cat() make_sound(dog) # 输出: Woof! make_sound(cat) # 输出: Meow! ``` 使用抽象基类后,任何继承 `Animal` 的子类都必须实现 `speak` 方法,从而保证多态行为的统一性[^2]。 ### 4. 多态与条件逻辑的结合 在实际开发中,`if` 多态常用于处理不同业务场景下的行为差异。例如根据不同的用户角色执行不同的操作: ```python class User: def access_level(self): pass class Admin(User): def access_level(self): return "Full access" class Guest(User): def access_level(self): return "Limited access" def check_access(user): if isinstance(user, Admin): print("Admin:", user.access_level()) elif isinstance(user, Guest): print("Guest:", user.access_level()) else: print("Unknown user") admin = Admin() guest = Guest() check_access(admin) # 输出: Admin: Full access check_access(guest) # 输出: Guest: Limited access ``` 通过 `if` 判断用户类型,执行不同的权限检查逻辑,这是“`if` 多态”的典型应用场景之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值