十七、python 继承多重继承
继承
1、根据已有的类生产新的类
继承的目的:代码重用;多态
2、多重继承
菱形继承的问题
经典类:深度优先
新式类:广度优先
Inspect.getmro(class)
---------------------------------------------------
如下体现新式类的广度优先:即寻找顺序是: 类B---> 类C ----> 类A。如下代码输出:cc
class
A(object):
def
a(self):
print
'aa'
class B(A):
pass
# def a(self):
# print 'bb'
class C(A):
def
a(self):
print
'cc'
class E(B,C):
pass
e = E()
e.a()
如下体现经典类的深度优先:即寻找顺序是: 类B---> 类A ----> 类C。如下代码输出:aa
class
A():
def
a(self):
print
'aa'
class B(A):
pass
# def a(self):
# print 'bb'
class C(A):
def
a(self):
print
'cc'
class E(B,C):
pass
e = E()
e.a()
---------------------------------------------------
------------------------------------------------
class A(object):
def __init__(self):
print 'in A'
class B(A):
pass
b = B()
class C(A):
print 'in c'
c = C()
class D(A):
def __init__(self):
A.__init__(self)
print 'in d'
d = D()
#----------------------------------------
class E:
print 'in E0000'
def __init__(self):
print 'in E'
class F:
print 'in F0000'
def __init__(self):
print 'in F'
class G(F,E): #交换两个被继承类的位置,你在看看??当两个类中有相同方法时又是调用那个??
print 'in G'
g = G()
print '---------------------------'
class M(A):
def __init__(self):
#A.__init__(self)
super(M, self).__init__()
print 'in M'
class N(A):
def __init__(self):
#A.__init__(self)
super(N,self).__init__()
print 'in N'
class P(M,N): #发现A被初始化两次??有问题,怎么解决,用super调用
def __init__(self):
#M.__init__(self)
#N.__init__(self)
super(P,self).__init__() #使用super关键字,A就只被初始化一次。super关键字是新式类中有的,建议使用
print 'in P'
p = P()
#使用交互式
import inspect
inspect.getmro(P)
#(<class '__main__.P'>, <class '__main__.M'>, <class '__main__.N'>, <class '__main__.A'>, <type 'object'>)
#把A改成经典类,然后再把super注释,因为super是新式类的
inspect.getmro(P)
#(<class __main__.P at 0x00000000026CCA68>, <class __main__.M at 0x00000000026CCD08>, <class __main__.A at 0x00000000026CCDC8>, <class __main__.N at 0x00000000026CCA08>)
---------------------------------------------
注:
super(子类名字,self):self放在后面,需要和属性方法分开