文章目录
- 1. 多态
- 1.1 什么是多态
- 1.2 多态实现方式
- 1.3 多态的好处
- 1.4 多态的好处
- 1.5 不同层面的理解
- 1.6 多态的优缺点
1. 多态
在 Python 里,多态是一种非常有用的编程特性,它能让你以统一的方式处理不同类型的对象
1.1 什么是多态
多态就好比在生活中,不同职业的人面对 “工作” 这件事,会有不同的表现。
比如老师的工作是教书,医生的工作是治病。虽然大家说的都是 “工作”,但具体的行为却不一样。
在编程中,多态允许你使用相同的代码来处理不同类型的对象,而这些对象会根据自身的类型做出不同的响应。
1.2 多态实现方式
在 Python 里,多态主要通过 继承 和 方法重写 来实现。
下面是一个简单的示例:
# 定义一个父类
class Animal:def speak(self):pass# 定义子类 Dog,继承自 Animal
class Dog(Animal):def speak(self):return "汪汪汪"# 定义子类 Cat,继承自 Animal
class Cat(Animal):def speak(self):return "喵喵喵"# 定义一个函数,用于调用动物的 speak 方法
def animal_speak(animal):print(animal.speak())# 创建 Dog 和 Cat 的实例
dog = Dog()
cat = Cat()# 调用 animal_speak 函数,传入不同的对象
animal_speak(dog)
animal_speak(cat)# 结果
汪汪汪
喵喵喵***Repl Closed***
在这个例子中:
- Animal 是父类,它定义了一个 speak 方法,但这个方法没有具体的实现。
- Dog 和 Cat 是 Animal 的子类,它们都重写了 speak 方法,实现了自己独特的叫声。
- animal_speak 函数接受一个 Animal 类型的对象作为参数,并调用该对象的 speak 方法。
- 当我们传入 Dog 或 Cat 的实例时,animal_speak 函数会根据对象的实际类型调用相应的 speak 方法,这就是多态的体现。
1.3 多态的好处
- 代码复用:通过多态,你可以编写通用的代码来处理不同类型的对象,避免了为每种对象类型编写重复的代码。
- 可扩展性:当需要添加新的对象类型时,只需创建一个新的子类并实现相应的方法,而不需要修改现有的代码。
1.4 多态的好处
Python 是一种动态类型语言,这意味着在运行时才确定变量的类型。这种特性使得多态在 Python 中更加灵活。只要对象具有所需的方法,就可以将其传递给相应的函数,而不需要考虑对象的具体类型。
1.5 不同层面的理解
- 鸭子类型(Duck Typing)
在 Python 中,多态常常通过鸭子类型来体现。
鸭子类型的核心思想是:“如果它走路像鸭子,叫声像鸭子,那么它就是鸭子”。也就是说,在代码中不关注对象的具体类型,只关注对象是否具有特定的方法和属性。
class Bird:def fly(self):print("鸟在飞")class Airplane:def fly(self):print("飞机在飞")def make_fly(obj):obj.fly()bird = Bird()
airplane = Airplane()make_fly(bird)
make_fly(airplane)
在这个例子中,make_fly 函数不关心传入的对象是 Bird 类还是 Airplane 类的实例,只要对象有 fly 方法,就可以调用该方法,这就是鸭子类型实现的多态。
- 多态与其他特性的关联
多态与继承:
继承是实现多态的重要手段之一。通过继承,子类可以重写父类的方法,从而在调用相同方法时表现出不同的行为。前面已经有很多通过继承实现多态的例子,比如动物叫声、图形绘制等。
多态与封装:
封装是将数据和操作数据的方法捆绑在一起,隐藏对象的内部实现细节。多态可以基于封装来实现,不同的类通过封装各自的方法,在外部调用时以统一的方式呈现不同的行为。例如在游戏开发中,每个角色类封装了自己的攻击方法,外部通过统一的接口调用攻击方法,体现了多态。
1.6 多态的优缺点
- 优点
-
代码复用和可维护性:可以编写通用的代码来处理不同类型的对象,减少代码重复,提高代码的可维护性。当需要添加新的对象类型时,只需要实现相应的方法,而不需要修改现有的代码。
-
扩展性:易于扩展系统功能。例如在图形绘制系统中,添加新的图形类型时,只需要创建新的子类并实现绘制方法,就可以无缝集成到现有的系统中。
- 缺点
-
理解难度:对于初学者来说,多态尤其是涉及到复杂的继承和多继承时,可能会增加理解的难度。需要对类的层次结构和方法调用顺序有清晰的认识。
-
性能开销:在某些情况下,多态可能会带来一定的性能开销,特别是在使用抽象基类和复杂的方法查找时。不过在大多数实际应用中,这种开销通常是可以接受的。