python 类的继承及super的研究

参考来源:
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)

说明:

  1. super(Son, self).run(speed)在python2.x中的写法。在python3.x中使用super().run(speed)即可,super不用传入参数。
  2. 父类的初始化化方法'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
(, , , , )

分析:

  1. 使用super,避免直接使用类名,以后如果类名修改,不用修改代码。如果基类被多个子类继承,一旦改动,会造成多处代码修改。
  2. 如上两种方法继承,会发现第二种方法BaseCla只调用了一次,而第一种方法却调用的两遍。
  3. 第二种方法可以看出,super 的继承顺序是 son2 、son1。在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(Grandson.__mro__)。

你可能感兴趣的:(python 类的继承及super的研究)