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'
参考案例一(单项链表)

相关文章: