Python 学习笔记(十五)Python类拓展(一)继承

继承

继承(Inheritance):是面向对象软件技术当中的一个概念。如果一个类别A "继承自" 另一个类B,就把这个A称为“B的子类”,而把B称为“A的父类”,也可以称“B是A的超类”。

          重用代码

          属性和方法的继承

单继承和super函数

示例1:子类调用父类update_web(),执行父类update_web()

 1 #! /usr/bin/env python
 2 # coding:utf-8
 3 
 4 class Person(object): #新式类
 5 
 6     def __init__(self,web_site): #初始化方法
 7         self.web =web_site
 8 
 9     def update_web(self,site):
10         self.web =site
11         return self.web
12 
13 
14 class Cc(Person): #继承了Person类,子类继承了一个父类,叫单继承
15 
16       def about_me(self,name,site): #继承关系,调用父类update_web方法
17           my_web =self.update_web(site)
18           return {"name":name,"web":my_web}
19 
20    
21     
22 
23 if __name__ =="__main__":
24     my =Cc("www.weibo.com")
25     print my.about_me("cc","cc.blog.com")
26     print my.web
27 
28 
29 #output
30 #{'web': 'cc.blog.com', 'name': 'cc'}
31 #cc.blog.com

示例2:子类重写父类update_web()方法,在子类中调用,执行子类的update_web()方法

 1 #! /usr/bin/env python
 2 # coding:utf-8
 3 
 4 class Person(object): #新式类
 5 
 6     def __init__(self,web_site): #初始化方法
 7         self.web =web_site
 8 
 9     def update_web(self,site):
10         self.web =site
11         return self.web
12 
13 
14 class Cc(Person): #继承了Person类,子类继承了一个父类,叫单继承
15 
16     def update_web(self,site,lang="python"):#此处重写了父类的方法,或者是覆盖了父类的方法
17          self.web =site
18          self.lang =lang
19          return self.web,self.lang
20 
21    
22     def about_me(self,name,site): #继承关系,此处调用子类的方法
23        my_web,my_lang=self.update_web(site)
24        return {"name":name,"web":my_web,"lang":my_lang}
25     
26 
27 if __name__ =="__main__":
28     my =Cc("www.weibo.com")
29     print my.about_me("cc","cc.blog.com")
30     
31 #output
32 #{'lang': 'python', 'web': 'cc.blog.com', 'name': 'cc'}

示例3:调用父类中被覆盖的方法,使用super()函数,或者父类.方法名

 1 #! /usr/bin/env python
 2 # coding:utf-8
 3 
 4 class Person(object): #新式类
 5 
 6     def __init__(self,web_site): #初始化方法
 7         self.web =web_site
 8 
 9     def update_web(self,site):
10         self.web =site
11         return self.web
12 
13 
14 class Cc(Person): #继承了Person类,子类继承了一个父类,叫单继承
15 
16     def __init__(self,teacher,web_site):
17         self.teacher =teacher
18         #Person.__init__(self,web_site) #调用父类的init方法
19         super(Cc,self).__init__(web_site) #调用父类中被覆盖的方法
20         
21     
22 
23     def update_web(self,site,lang="python"):#此处重写了父类的方法,或者是覆盖了父类的方法
24          self.web =site
25          self.lang =lang
26          return self.web,self.lang
27 
28     def your_teacher(self):
29         return self.teacher
30 
31    
32     def about_me(self,name,site): #继承关系,此处调用子类的方法
33        my_web,my_lang=self.update_web(site)
34        return {"name":name,"web":my_web,"lang":my_lang}
35     
36 
37 if __name__ =="__main__":
38     my =Cc("cclaoshi","cnblog.com")
39     print my.your_teacher()
40     print my.teacher
41     print my.web
42 
43 #output
44 #cclaoshi
45 #cclaoshi
46 #cnblog.com

 多重继承

示例:

 1 #! /usr/bin/env python
 2 # coding:utf-8
 3 
 4 class Person(object): #新式类
 5     def eye(self):
 6         print "two eyes"
 7 
 8     def breast(self,n):
 9         print "The breast is:",n
10 
11 
12 class Girl(object):
13     def __init__(self,age):
14         self.age =age
15 
16     def color(self):
17         print "The girl is white."
18 
19 
20 class BeaGirl(Person,Girl):#多继承,写入两个类的名字,将父类的所有方法继承过来
21     pass
22 
23 
24 
25 
26 if __name__ =="__main__":
27     kong = BeaGirl(28)
28     kong.eye()
29     kong.breast(90)
30     kong.color()
31     print kong.age
32 
33 
34 #output
35 #two eyes
36 #The breast is: 90
37 #The girl is white.
38 #28

示例:多重继承的执行顺序,广度优先

 1 #! /usr/bin/env python
 2 # coding:utf-8
 3 
 4 class K1(object): #新式类
 5     def foo(self):
 6         print "K1-foo"
 7 
 8 
 9 
10 class K2(object):
11     def foo(self):
12         print "K2-foo"
13 
14     def bar(self):
15         print "K2-bar"
16 
17 
18 class J1(K1,K2):#多继承,写入两个类的名字,将父类的所有方法继承过来
19     pass
20 
21 
22 class J2(K1,K2):
23     def bar(self):
24         print "J2-bar"
25 
26 class C(J1,J2):
27     pass
28 
29 
30 
31 
32 if __name__ =="__main__":
33     print C.__mro__
34     m =C()
35     m.foo()
36     m.bar()
37 
38 #这种继承顺序称为广度优先
39 #output
40 #(<class '__main__.C'>, <class '__main__.J1'>, <class '__main__.J2'>,
41 #  <class '__main__.K1'>, <class '__main__.K2'>, <type 'object'>)
42 #K1-foo
43 #J2-bar

 

posted @ 2018-04-09 21:01  冰雪柔情的天空  阅读(400)  评论(0编辑  收藏  举报