Python中新式类,子类使用super方法显式调用父类的__init__方法
2014-11-30 16:18
801 查看
Python中,类自身或者其父类继承了object那么这个类就是个新式类,若没有继承object,则是经典类。
因为Python中存在多重继承,在新式类中,要查找或调用一个方法或属性时,使用的是广度优先搜索算法;而在经典类中则使用深度优先搜索算法。
看新式类中的广度优先算法,一个简单的例子,例子中把子类使用super方法显式调用父类的__init__方法也呈现:
class A(object):
def __init__(self):
self.name = 'Jeremy'
class B(A):
def __init__(self):
super(B,self).__init__()
self.name = 'Jian'
class C(B):
def __init__(self):
super(C,self).__init__()
self.name = 'Zhao'
class D(A):
def __init__(self):
super(D,self).__init__()
self.name = 'Zhao Jian'
class E(D,C,A):
def __init__(self):
super(E,self).__init__()
self.lover = 'Aimee'
print self.name + " love " + self.lover
e = E()
很明显,这段代码执行的结果如下:
因为E在查找self.name时先从D中查找,所以self.name = 'Zhao Jian'
如果把D中的self.name 注释掉,执行的结果如下:
D中没有self.name属性,按照广度优先搜索,查找的应该是C中self.name属性,所以得到的结果是self.name = 'Zhao'
如果再把C中的self.name属性注释掉,那么应该查找A中的self.name属性,但是因为B继承了A,所以应该先查找B中的self.name属性
所以执行结果如下:
使用super方法来调用父类的__init__方法只有在新式类中才可以这样做
因为Python中存在多重继承,在新式类中,要查找或调用一个方法或属性时,使用的是广度优先搜索算法;而在经典类中则使用深度优先搜索算法。
看新式类中的广度优先算法,一个简单的例子,例子中把子类使用super方法显式调用父类的__init__方法也呈现:
class A(object):
def __init__(self):
self.name = 'Jeremy'
class B(A):
def __init__(self):
super(B,self).__init__()
self.name = 'Jian'
class C(B):
def __init__(self):
super(C,self).__init__()
self.name = 'Zhao'
class D(A):
def __init__(self):
super(D,self).__init__()
self.name = 'Zhao Jian'
class E(D,C,A):
def __init__(self):
super(E,self).__init__()
self.lover = 'Aimee'
print self.name + " love " + self.lover
e = E()
很明显,这段代码执行的结果如下:
因为E在查找self.name时先从D中查找,所以self.name = 'Zhao Jian'
如果把D中的self.name 注释掉,执行的结果如下:
D中没有self.name属性,按照广度优先搜索,查找的应该是C中self.name属性,所以得到的结果是self.name = 'Zhao'
如果再把C中的self.name属性注释掉,那么应该查找A中的self.name属性,但是因为B继承了A,所以应该先查找B中的self.name属性
所以执行结果如下:
使用super方法来调用父类的__init__方法只有在新式类中才可以这样做
相关文章推荐
- Python3基础 super层层调用父类的__init__方法 子类的__init__覆盖了父类的__init__的解决方法
- python中子类调用父类方法几点细节(正确使用super)
- python super() 方法使用
- python子类调用父类的方法-super
- Python中__init__方法使用
- python中类的继承,初始化,super()__init__()方法
- Python中super()和__init__()方法
- python 详解类class的继承、__init__初始化、super方法(五)
- python中子类继承父类的__init__方法实例
- Python 中__init__.py的使用(通过包调用方法)
- python 子类继承父类的__init__方法
- Python中的super()方法使用简介
- python中的__new__方法与__init__方法区别与调用;通过使用__new__实现单例模式
- 一个子类要调用父类的方法时,默认是使用this还是super?
- init()方法必须使用super.init(config)的原因
- Python中__init__方法使用
- Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法
- python Class高级编程:super().__init__使用
- 子类与父类属性或方法重名时,使用super.(属性名/方法名)调用父类型属性或方法
- python中子类继承父类的__init__方法实例