当前位置 : 主页 > 编程语言 > python >

python进阶四(类的继承)【4-4 python中多重继承】

来源:互联网 收集:自由互联 发布时间:2021-06-25
python中多重继承 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。 多重继承的继承链就不是一棵树了,它像这样: 1 class A(object): 2 def __init__ (self, a): 3 print ‘ init A

python中多重继承

除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。

多重继承的继承链就不是一棵树了,它像这样:

 1 class A(object):
 2     def __init__(self, a):
 3         print init A...
 4         self.a = a
 5 
 6 class B(A):
 7     def __init__(self, a):
 8         super(B, self).__init__(a)
 9         print init B...
10 
11 class C(A):
12     def __init__(self, a):
13         super(C, self).__init__(a)
14         print init C...
15 
16 class D(B, C):
17     def __init__(self, a):
18         super(D, self).__init__(a)
19         print init D...

看下图:

 

 像这样,D 同时继承自 B 和 C,也就是 D 拥有了 A、B、C 的全部功能。多重继承通过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只调用一次:

多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。

举个例子,Python的网络服务器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服务器运行模式有 多进程ForkingMixin 和 多线程ThreadingMixin两种。

要创建多进程模式的 TCPServer:

class MyTCPServer(TCPServer, ForkingMixin)
    pass

要创建多线程模式的 UDPServer:

class MyUDPServer(UDPServer, ThreadingMixin):
    pass

如果没有多重继承,要实现上述所有可能的组合需要 4x2=8 个子类。

任务

+-Person
  +- Student
  +- Teacher

是一类继承树;

+- SkillMixin
   +- BasketballMixin
   +- FootballMixin

是一类继承树。

通过多重继承,请定义“会打篮球的学生”和“会踢足球的老师”。

 1 class Person(object):#Person父类
 2     pass
 3 
 4 class Student(Person):#继承Person的Student子类
 5     pass
 6 
 7 class Teacher(Person):#继承Person的Teacher子类
 8     pass
 9 
10 class SkillMixin(object):#SkillMixing父类
11     pass
12 
13 class BasketballMixin(SkillMixin):#继承SkillMixing父类的BasketballMixin子类
14     def skill(self):#一个实例,返回basketball这个字符串
15         return basketball
16 
17 class FootballMixin(SkillMixin):#继承SkillMixing父类的FootballMixin子类
18     def skill(self):#一个实例,返回football这个字符串
19         return football
20 
21 class BStudent(Student,BasketballMixin):#多重继承Student子类和BasketballMixin子类的BStudent子类
22     pass
23 
24 class FTeacher(Teacher,FootballMixin):#多重继承Student子类和BasketballMixin子类的FTeacher子类
25     pass
26 
27 s = BStudent()#调用类的方法,赋值给s
28 print s.skill()#调用BStudent子类中的skill实例的方法
29 
30 t = FTeacher()
31 print t.skill()
网友评论