Python面向对象3要素-多态
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.多态概述
OCP原则:多用“继承”,少修改。
继承的用途:在子类上实现对基类的增强,实现多态。
在面向对象这种,父类,子类通过继承联系在一起,如果可以通过一套方法,就可以实现不同表现,就是多态。
一个类继承自多个类就是多继承,它将具有多个类的特征。
二.多态案例
我们之前已经学习过面向对象的三要素之封装和继承。多态就是一个很简单的定义,在Python中多态的表现需要满足两个要求即可。即继承父类且重写父类的方法。
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 7 class Animal: 8 def __init__(self,name): 9 self._name = name 10 11 def shout(self): 12 raise Exception("方法需要重写") 13 14 class Cat(Animal): 15 def shout(self): 16 print("喵喵喵~") 17 18 class Dog(Animal): 19 def shout(self): 20 print("汪汪汪~") 21 22 23 c = Cat("布偶") 24 c.shout() 25 26 d = Dog("二哈") 27 d.shout() 28 29 30 #以上代码执行结果如下: 31 喵喵喵~ 32 汪汪汪~
三.小试牛刀
1>.Shape基类,要求所有子类都必须提供面积的计算,子类有三角形,矩形,圆(多态应用)
2>.上体圆类的数据可序列化。(Mixin)
3>.链表实现
用面向对象实现LinkedList链表
单向链表实现append,iternodes方法
双向链表实现append,pop,insert,remove,iternodes方法
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 """ 7 用面向对象实现LinkedList链表 8 单向链表实现append,iternodes方法 9 双向链表实现append,pop,insert,remove,iternodes方法 10 """ 11 12 class SingleNode: #节点保存内容和下一条 13 def __init__(self,item,next=None): 14 self.item = item 15 self.next = next 16 17 def __repr__(self): 18 return repr(self.item) 19 20 class LinkList: 21 def __init__(self): 22 self.head = None #用于存储上一个SingleNode的信息 23 self.tail = None #用于存储下一个SingleNode的信息 24 25 def append(self,item): 26 node = SingleNode(item) 27 if self.head is None: 28 self.head = node #设置节点开头,以后不变 29 else: 30 self.tail.next = node #当前最后一个节点关联下一个SingleNode 31 self.tail = node #更新结尾节点 32 return self 33 34 def iternodes(self): 35 current = self.head 36 while current: 37 yield current 38 current = current.next 39 40 41 42 s = LinkList() 43 s.append("尹正杰") 44 s.append(100).append(200) 45 s.append("Jason Yin") 46 47 print(s.head) 48 print(s.tail) 49 50 print("{0} 我是分割线 {0}".format("*" * 15)) 51 52 for item in s.iternodes(): 53 print(item) 54 55 56 57 58 59 #以上代码执行结果如下: 60 '尹正杰' 61 'Jason Yin' 62 *************** 我是分割线 *************** 63 '尹正杰' 64 100 65 200 66 'Jason Yin'