参考来源:
http://www.cnblogs.com/dkblog/archive/2011/02/24/1980654.html
类的继承
# -*- coding: utf-8 -*-
class BaseCla(object):
def __init__(self):
print 'I\'am baseCla'
def run(self, speed):
print 'parent run {}'.format(speed)
class Son(BaseCla):
def __init__(self):
super(Son, self).__init__()
print 'I\'am expCla'
def run(self, speed):
print 'son run {}'.format(speed)
super(Son, self).run(speed)
if __name__ == '__main__':
s = Son()
s.run(5)
说明:
-
super(Son, self).run(speed)
在python2.x中的写法。在python3.x中使用super().run(speed)
即可,super不用传入参数。 - 父类的初始化化方法'init()'并不会自动调用,所以在子类中需要自己使用super调用。
分析: super的好处?为何要使用super,而不是直接用类名代替?
写法一:
# -*- coding: utf-8 -*-
class BaseCla(object):
def __init__(self):
print 'I\'am BaseCla'
class Son1(BaseCla):
def __init__(self):
BaseCla.__init__(self)
print 'I\'am son1'
class Son2(BaseCla):
def __init__(self):
BaseCla.__init__(self)
print 'I\'am son2'
class Grandson(Son1, Son2):
def __init__(self):
Son1.__init__(self)
Son2.__init__(self)
print 'I\'am Grandson'
if __name__ == '__main__':
Grandson()
结果:
I'am BaseCla
I'am son1
I'am BaseCla
I'am son2
I'am Grandson
写法二:
# -*- coding: utf-8 -*-
class BaseCla(object):
def __init__(self):
print 'I\'am BaseCla'
class Son1(BaseCla):
def __init__(self):
super(Son1, self).__init__()
print 'I\'am son1'
class Son2(BaseCla):
def __init__(self):
super(Son2, self).__init__()
print 'I\'am son2'
class Grandson(Son1, Son2):
def __init__(self):
super(Grandson, self).__init__()
print 'I\'am Grandson'
if __name__ == '__main__':
Grandson()
print Grandson.__mro__
结果:
I'am BaseCla
I'am son2
I'am son1
I'am Grandson
(<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.BaseCla'>, <type 'object'>)
分析:
- 使用super,避免直接使用类名,以后如果类名修改,不用修改代码。如果基类被多个子类继承,一旦改动,会造成多处代码修改。
- 如上两种方法继承,会发现第二种方法
BaseCla
只调用了一次,而第一种方法却调用的两遍。 - 第二种方法可以看出,
super
的继承顺序是 son2 、son1。在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(Grandson.__mro__)。