当前位置: 首页 > 图灵资讯 > 行业资讯> Python多态原理及实现

Python多态原理及实现

发布时间:2025-10-28 16:12:44

对于弱型语言,变量没有声明类型,因此同一变量可以在不同的时间引用不同的对象。当同一变量调用同一方法时,可能会出现多种行为(具体行为由变量引用的对象决定),即所谓的多态(Polymorphism)。

先看下面的程序:

classBird:
defmove(self,field):
print('鸟在%s上自由飞翔'%field)
classDog:
defmove(self,field):
print('狗在%s中快速奔跑'%field)
#x变量被赋值为Bird对象
x=Bird()
#调用x变量的move()方法
x.move('天空')
#x变量被赋值为Dog对象
x=Dog()
#调用x变量的move()方法
x.move('草地')

上面程序中 x 变量开始被赋值 Bird 对象,所以当 x 变量执行 move() 在方法上,它会表现出鸟类的飞行行为。接下来 x 变量被赋值为 Dog 对象,所以当 x 变量执行 move() 在方法上,它会表现出狗的奔跑行为。

操作上述程序时,可以看到以下操作结果:

鸟在天空中自由飞翔
狗在草地上快速奔跑

从上述操作结果可以看出,相同的变量 x 执行同一个 move() 因为方法 x 指向对象不同,因此呈现出不同的行为特征,即多态。

看到这里,一些读者可能会感到失望。这种多态性有什么用?不就是创建对象和调用方法吗?看不出多态性有什么好处?

事实上,多态是一种非常灵活的编程机制。如果我们想定义一个 Canvas(画布)类,这个画布类定义为一个 draw_pic() 该方法负责绘制各种图形。这个 Canvas代码如下:

classCanvas:
defdraw_pic(self,shape):
print('--开始绘图-ལ)
shape.draw(self)

从上面的代码可以看出,Canvas 的 draw_pic() 该方法需要输入一个 shape 该方法是调用参数 shape 参数的 draw() 在画布上画自己的方法。根据上述程序,Canvas 的 draw_pic() 只需带一个输入的参数对象 draw() 方法就够了。至于这种方法有什么样的行为(实施什么样的绘制行为),这和 draw_pic() 该方法完全分离,为编程增加了极大的灵活性。以下程序定义了三个图形类别,并为它们提供了它们 draw() 方法,这样他们就可以在画布上画出不同的行为,这就是多态的实际应用。查看以下示例程序:

classCanvas:
defdraw_pic(self,shape):
print('--开始绘图-ལ)
shape.draw(self)

classRectangle:
defdraw(self,canvas):
print('在%s上绘制矩形'%canvas)
classTriangle:
defdraw(self,canvas):
print('在%s上绘制三角形'%canvas)
classCircle:
defdraw(self,canvas):
print('在%s上画一个圆形'%canvas)
c=Canvas()
#输入Rectangle参数,绘制矩形
c.draw_pic(Rectangle())
#输入Triangle参数,绘制三角形
c.draw_pic(Triangle())
#输入Circle参数,绘制圆形参数
c.draw_pic(Circle())

操作上述代码, 可见以下输出结果:

--开始绘图--
在<__main__.Canvasobjectat0x000021CA364>上绘制矩形
--开始绘图--
在<__main__.Canvasobjectat0x000021CA364>在上面画三角形
--开始绘图--
在<__main__.Canvasobjectat0x000021CA364>上绘制圆形

Python多态的优势可以从上面的例子中体现出来。当程序涉及时 Canvas 类的 draw_pic() 该方法所需的参数非常灵活。只要该方法引入的参数对象具有指定的方法,该方法所呈现的行为特征就完全取决于对象本身,这大大改进了 draw_pic() 方法的灵活性。

相关文章

Python多态原理及实现

Python多态原理及实现

2025-10-28
Python之time模块详解

Python之time模块详解

2025-10-27
Python之random模块详解

Python之random模块详解

2025-10-27
Python导入模块,Python import用法(超级详细)

Python导入模块,Python import用法(超级详细)

2025-10-27
Python类调用实例方法

Python类调用实例方法

2025-10-27
Python之初识类与对象

Python之初识类与对象

2025-10-27