Python编程的面向对象(二)—类的多态
在面向对象编程中,多态是一种重要的概念,指的是不同类的对象可以对相同的消息作出响应,表现出不同的行为。多态允许使用基类的引用来调用派生类的方法,实现了接口的统一。
多态的特点:
- 多态性:相同的函数名但是具有不同的行为。
- 灵活性:通过多态性,可以根据对象的实际类型来调用相应的方法。
- 简化代码:实现多态性可以减少代码的复杂性,提高代码的可读性和可维护性。
多态示例代码(1):
下面是一个简单的 Python 示例,演示了多态的概念:
# 定义动物类 Animal
class Animal:def speak(self):pass# 定义子类 Dog 和 Cat,它们继承自 Animal
class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 函数接受 Animal 类的实例并调用 speak 方法
def animal_speak(animal):return animal.speak()# 创建 Dog 和 Cat 对象,并调用 speak 方法
dog = Dog()
cat = Cat()print(animal_speak(dog)) # 输出: Woof!
print(animal_speak(cat)) # 输出: Meow!
在这个示例中:
Animal
是基类,定义了speak
方法。Dog
和Cat
分别是派生类,它们重写了speak
方法,表现出不同的行为。animal_speak
函数以Animal
类的对象为参数,调用其speak
方法,实现了多态性。
通过多态性,即使我们传入不同类型的动物对象,animal_speak
函数也能根据实际的对象类型调用正确的方法来产生不同的行为,展现了多态的特性。
多态示例代码(2):
class Canvas:def draw_pic(self, shape):print('\n-- 开始绘图 --')shape.draw(self)class Rectangle:def draw(self, canvas):print('开始绘制矩形')class Circle:def draw(self, canvas):print('开始绘制圆形')class Triangle:def draw(self, canvas):print('开始绘制三角形')class Line:def draw(self, canvas):print('开始绘制直线')class Arc:def draw(self, canvas):print('开始绘制圆弧')c = Canvas()# 传人Rectangle参数,绘制矩形
c.draw_pic(Rectangle())
# 传入Triangle参数,绘制三角形
c.draw_pic(Triangle())
# 传人Circle参数,绘制圆形
c.draw_pic(Circle())
# 传入Line参数,绘制直线
c.draw_pic(Line())
# 传入Arc参数,绘制圆弧
c.draw_pic(Arc())
类Canvas的draw_pic()方法需要传入一个shape参数,该方法就是调用shape参数的draw()方法将自己绘制到画布上。Canvas的draw_pic()传入的参数对象只要带一个draw()方法即可,至于该方法具有何种行为(到底执行怎样的绘制行为),这与draw_pic()方法是完全分离的,这就为编程增加了很大的灵活性。
运行结果如下:
-- 开始绘图 --
开始绘制矩形-- 开始绘图 --
开始绘制三角形-- 开始绘图 --
开始绘制圆形-- 开始绘图 --
开始绘制直线-- 开始绘图 --
开始绘制圆弧