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()方法是完全分离的,这就为编程增加了很大的灵活性。
运行结果如下:
-- 开始绘图 --
开始绘制矩形
-- 开始绘图 --
开始绘制三角形
-- 开始绘图 --
开始绘制圆形
-- 开始绘图 --
开始绘制直线
-- 开始绘图 --
开始绘制圆弧