python多继承(新式类)一
2013-08-26 21:38
183 查看
最近在学习python的多重继承。
先来了解下多重继承的概念,所谓多重继承,是指python的类可以有两个以上父类,也即有类A,类B,类C,C同时继承类A与类B,此时C中可以使用A与B中的属性与方法。那么问题来了,如果A与B中具有相同名字的方法,这个时候python怎么调用的会是哪个方法呢?
举个例子:
classA(object):
def__init__(self):
pass
deffoo(self):
print'Afoo'
classB(object):
def__init__(self):
pass
deffoo(self):
print'Bfoo'
classC(A,B):
def__init__(self):
pass
testc=C()
testc.foo()
实际上打印出来的信息是Afoo,这就说明了调用的是A中的方法。其实在python2.2之后,多继承中基类的寻找顺序是一种广度优先算法,称之为C3的算法(后续博客我会简单介绍下C3算法)。而python2.2之前,使用的是深度优先算法来寻找基类方法。在类C的继承关系中,按照广度优先算法,则会先找到靠近C的基类A,在A中找到foo方法之后,就直接返回了,因此即使后面的基类B中也有foo方法,但是这里不会引用它。
更加清晰的多继承例子:
(<class'__main__.D'>,<class'__main__.C1'>,<class'__main__.C2'>,<class'__main__.A'>,<class'__main__.B'>,<type'object'>)
Afoo(实际上搜索顺序为D=>C1=>A)
C2bar(实际上搜索顺序为D=>C1=>C2)
可以看到,foo找到的是A类中的方法,bar找到的是C2中的方法。
其实新式类的搜索方法是采用了“广度优先”的方式去查找属性。
只有新式类有__mro__属性,该属性标记了python继承层次中父类查找的顺序,python多重继承机制中就是按照__mro__的顺序进行查找,一旦找到对应属性,则查找马上返回。
经过上面的__mro__输出可以发现,D类的继承查找路径为:D=>C1=>C2=>A=>B=>object,通过该查找路径,foo方法将会调用A的foo方法,、bar方法将调用C2的方法,通过实际实验调用,查看输出内容确实与__mro__顺序一样。
先来了解下多重继承的概念,所谓多重继承,是指python的类可以有两个以上父类,也即有类A,类B,类C,C同时继承类A与类B,此时C中可以使用A与B中的属性与方法。那么问题来了,如果A与B中具有相同名字的方法,这个时候python怎么调用的会是哪个方法呢?
举个例子:
classA(object):
def__init__(self):
pass
deffoo(self):
print'Afoo'
classB(object):
def__init__(self):
pass
deffoo(self):
print'Bfoo'
classC(A,B):
def__init__(self):
pass
testc=C()
testc.foo()
实际上打印出来的信息是Afoo,这就说明了调用的是A中的方法。其实在python2.2之后,多继承中基类的寻找顺序是一种广度优先算法,称之为C3的算法(后续博客我会简单介绍下C3算法)。而python2.2之前,使用的是深度优先算法来寻找基类方法。在类C的继承关系中,按照广度优先算法,则会先找到靠近C的基类A,在A中找到foo方法之后,就直接返回了,因此即使后面的基类B中也有foo方法,但是这里不会引用它。
更加清晰的多继承例子:
classA(object): deffoo(self): print'Afoo' classB(object): deffoo(self): print'Bfoo' defbar(self): print'Bbar' classC1(A,B): pass classC2(A,B): defbar(self): print'C2-bar' classD(C1,C2): pass if__name__=='__main__': printD.__mro__#只有新式类有__mro__属性,告诉查找顺序是怎样的 d=D() d.foo() d.bar() 执行的结果为:
(<class'__main__.D'>,<class'__main__.C1'>,<class'__main__.C2'>,<class'__main__.A'>,<class'__main__.B'>,<type'object'>)
Afoo(实际上搜索顺序为D=>C1=>A)
C2bar(实际上搜索顺序为D=>C1=>C2)
可以看到,foo找到的是A类中的方法,bar找到的是C2中的方法。
其实新式类的搜索方法是采用了“广度优先”的方式去查找属性。
只有新式类有__mro__属性,该属性标记了python继承层次中父类查找的顺序,python多重继承机制中就是按照__mro__的顺序进行查找,一旦找到对应属性,则查找马上返回。
经过上面的__mro__输出可以发现,D类的继承查找路径为:D=>C1=>C2=>A=>B=>object,通过该查找路径,foo方法将会调用A的foo方法,、bar方法将调用C2的方法,通过实际实验调用,查看输出内容确实与__mro__顺序一样。
相关文章推荐
- python多继承(新式类)一
- python中类继承和新式类的写法
- Python中新式类 经典类的区别(即类是否继承object)
- Python中新式类 经典类的区别(即类是否继承object)
- Python新式类继承的C3算法
- 关于 python 新式类和旧式类继承顺序的验证
- python 多继承(新式类) 二
- Python中新式类 经典类的区别(即类是否继承object)
- python 多继承(新式类) 三
- python多继承(新式类)一
- Python新式类多重继承时的顺序
- Python中新式类 经典类的区别(即类是否继承object)
- python新式类多重继承 广度优先搜索 C3算法
- python 多继承(新式类) 四
- python 零散记录(七)(下) 新式类 旧式类 多继承 mro 类属性 对象属性
- python 多继承(新式类) 三
- Python 多继承(新式类) 的mro算法
- python 多继承(新式类) 二
- python支持多重继承
- python常见的错误类型和继承关系