您的位置:首页 > 编程语言 > Python开发

python 继承多重继承

2017-08-17 00:15 232 查看
十七、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放在后面,需要和属性方法分开
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: