super,多继承

1、super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,

  但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

  总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半
  普通继承版

      class FooParent(object):
        def __init__(self):
          self.parent = ‘I\‘m the parent.‘
          print ‘Parent‘

        def bar(self,message):
          print message, ‘from Parent‘

      class FooChild(FooParent):
        def __init__(self):
          FooParent.__init__(self)
          print ‘Child‘

        def bar(self,message):
          FooParent.bar(self,message)
          print ‘Child bar function.‘
          print self.parent

      if __name__==‘__main__‘:
        fooChild = FooChild()
        fooChild.bar(‘HelloWorld‘)

    super继承版

      class FooParent(object):
        def __init__(self):
          self.parent = ‘I\‘m the parent.‘
          print ‘Parent‘

        def bar(self,message):
          print message,‘from Parent‘

      class FooChild(FooParent):
        def __init__(self):
          super(FooChild,self).__init__()
          print ‘Child‘

        def bar(self,message):
          super(FooChild, self).bar(message)
          print ‘Child bar fuction‘
          print self.parent

      if __name__ == ‘__main__‘:
        fooChild = FooChild()
        fooChild.bar(‘HelloWorld‘)

      程序运行结果相同,为:

      Parent
      Child
      HelloWorld from Parent
      Child bar fuction
      I‘m the parent.

      普通继承和super继承是一样的。但是其实它们的内部运行机制不一样,这一点在多重继承时体现得很明显。

      在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。python3中 super().__init__( )

2、多继承以及方法调用顺序
      class Car(object):
        def wheel_run(self):
                """车在用轮子移动"""
          print("-----通过轮子在移动----")

        def fire(self):
                """车开枪"""
          print("-----机关枪在发射子弹-----")

      class Tank(object):
        def fire(self):
              """开火"""
          print("----发射炮弹----")

      class ZJC(Tank, Car):
              """开火"""
        # super().fire()
        # super().fire()
        Tank.fire(self)
        Car.fire(self)
        print("-----发射火箭弹-----")

      zjc = ZJC()
      zjc.wheel_run()
      zjc.fire()

      print(ZJC.__mro__) # 使用类的名字.__mro__ 能够查看将来找方法的时候的顺序

时间: 2024-10-24 13:38:15

super,多继承的相关文章

关于Python中的类普通继承与super函数继承

关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接:http://blog.csdn.net/lqhbupt/article/details/19631991

Java学习----this和super(在继承中)

public class Base { /*public Base() { System.out.println("Base 类的初始构造方法"); }*/ public Base(int x) { System.out.println("Base 类的重载构造方法"); } public void a() { System.out.println("Base:a()"); } public void b() { // this 在哪个类里就是哪

深入super,看Python如何解决钻石继承难题

1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init__(self): print “Base init” 则普通方法如下 class Leaf(Base): def __init__(self): Base.__init__(self) print “Leaf init” super方法如下 class Leaf(Base): def __init_

(转载)深入super,看Python如何解决钻石继承难题

1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init__(self): print "Base init" 则普通方法如下 class Leaf(Base): def __init__(self): Base.__init__(self) print "Leaf init" super方法如下 class Leaf(Bas

python中的super()用法以及多继承协同任务

理解了python的MRO之后,我们就可以更加准确地使用super()函数,以及使用super()完成多继承协同任务 super().method()是调用父类中的方法,这个搜索顺序当然是按照MRO从前向后开始进行的 super([type][, object-or-type]) 根据官方文档,super函数返回一个委托类type的父类或者兄弟类方法调用的代理对象.super函数用来调用已经再子类中重写过的父类方法. 这句话其实很难看明白,为什么除了父类还可能是兄弟类? 要理解这句话,先谈谈su

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?

【python】-- 类的多继承、经典类、新式类

继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了,就是:子类可以继承多个父类,就叫多继承. class SchoolMember(object): #SchoolMember类 '''学校成员基类''' def tell(self): print("the schoolmeber is tell...") class School(ob

面向对象【day07】:类的属性-继承-经典类

本节内容 类的公有属性 析构函数 类的继承 新式类和经典类 一.类的公有属性 一.概述 前面我们讲了类的私有属性,现在我们来说说类的公有属性,这边很容易被人弄混淆,有人觉的,在__init__()构造方法中,除了私有属性,其他的都是公有属性了,其实这是一个错误的结论,并不是定义在__init__()初始化方法中的属性是公有属性(除私有属性),那什么是公有属性呢?揭起了大家的好奇心. 定义:指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性. 二.公有属性 2.1 定义 说明:在类中直接定

57 面向对象继承中构造方法的关系

1 class Demo1_Extends{ 2 public static void main(String[] args) { 3 Dog d = new Dog(); 4 } 5 } 6 7 class Animals extends Object{ 8 public Animals(){ 9 super() // 默认继承 Object类 10 System.out.println("父类无参构造方法"); 11 } 12 } 13 14 class Dog extends A