发布时间:2018-04-07 18:02:06编辑:admin阅读(4644)
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
简单来说:一种接口,多种实现。
多态的主要作用是实现接口的重用
举例:
class Animal(object): #动物 def __init__(self, name): # 构造函数 self.name = name def talk(self): #说话 pass class Cat(Animal): #猫 def talk(self): #说话 print('%s: 喵喵喵!' % self.name) class Dog(Animal): #狗 def talk(self): print('%s: 汪!汪!汪!' % self.name)
正常情况下,实例化对象
d = Dog("花花") d.talk() c = Cat("雪儿") c.talk()
执行输出:
花花: 汪!汪!汪!
雪儿: 喵喵喵!
上面的方法,必须先知道它是什么动物,才能让它叫
能不能同一个接口,比如animal.talk(),可以让所有的动物都叫
如何实现呢?
定义一个函数,完整代码如下:
#!/usr/bin/env python # coding: utf-8 __author__ = 'www.py3study.com' class Animal(object): #动物 def __init__(self, name): # 构造函数 self.name = name def talk(self): #说话 pass class Cat(Animal): #猫 def talk(self): #说话 print('%s: 喵喵喵!' % self.name) class Dog(Animal): #狗 def talk(self): print('%s: 汪!汪!汪!' % self.name) def animal_talk(obj): #一个接口,多种形态 obj.talk() d = Dog("花花") #实例化对象 c = Cat("雪儿") animal_talk(d) #执行函数,传一个对象 animal_talk(c)
执行输出:
花花: 汪!汪!汪!
雪儿: 喵喵喵!
这样执行,看不出啥效果,但问题在于,现在相当于有一个统一接口了
可以传入任意对象,根据对象的不通,实现不同的状态。
这种就是一种接口,多种实现
具体怎么实现,是在子类里面定义的。
这还不是真正意义的多态。
将这个接口,移植到父类里面
#!/usr/bin/env python # coding: utf-8 __author__ = 'www.py3study.com' class Animal(object): #动物 def __init__(self, name): # 构造函数 self.name = name def talk(self): #说话 pass @staticmethod #静态方法,需要通过类名来调用这个方法 def animal_talk(obj): # 统一接口 obj.talk() class Cat(Animal): #猫 def talk(self): #说话 print('%s: 喵喵喵!' % self.name) class Dog(Animal): #狗 def talk(self): print('%s: 汪!汪!汪!' % self.name) d = Dog("花花") #实例化对象 c = Cat("雪儿") Animal.animal_talk(d) #执行方法,传一个对象 Animal.animal_talk(c)
执行输出:
花花: 汪!汪!汪!
雪儿: 喵喵喵!
调用同一的接口,实现不同的状态,这就是多态(一种接口,多种实现)
这种场景,主要用在接口重用
就像统一的接口
上一篇: python 面向对象之继承实例讲解
下一篇: python 面向对象之静态方法
47744
46234
37109
34626
29228
25885
24744
19862
19415
17907
5715°
6314°
5834°
5887°
6983°
5829°
5845°
6360°
6315°
7672°