• 对python的super方法的用法理解


    参考链接:https://www.cnblogs.com/dkblog/archive/2011/02/24/1980654.html

         https://www.cnblogs.com/wjx1/p/5084980.html

    python中对象的方法第一个参数一般都是self,用于传递对象本身。但是在调用的时候不必显示传递,python会自动传递:

      class Example(object):  #  在Example类中定义一个function方法,function仅用来print传递进来的参数。

        def function(self, message):

          print message

      >>>Example().function('helloworld')

      helloword

    当子类需要调用父类中的方法时,需要将self参数显示传递:

      class Parent(object):   #  在Parent类中定义一个function_a方法,function仅用来print传递进来的参数。

        def function_a(self, message):

          print message

         def funtion_b(self):   #  在Parent类中定义一个function_b方法,用来print 'hi'字符串。

          print 'hi'

      class Child(Parent):   # 在Child类中定义一个function_a方法来调用父类的function_b方法。

        def function(self, message):

          Parent.function_b(self)

          print message

      >>>Child().function('helloword')

      hi

      helloworld

     这样做的坏处是如果修改了父类的名称,那么子类就可能会涉及多出修改,当多继承时修改的地方就会更多,这种方法这样就会显得累赘。

     为了解决这些问题,python引入了super()机制,例子代码如下:

      class Parent(object):

        def function_a(self, message):

          print message

        def function_b(self):

          print 'hi'

      class Child(Parent):
        def function(self, message):

          super(Child, self).function_b()

          print message

    >>>Child().function('helloworld')

      hi

      helloworld

    当你想继承了父类的方法但是又想对该方法做一些改变的时候用super。其实说白了super就是把父类中的代码给复制粘贴到子类中方便子类修改。

    从运行结果上看,普通继承和super继承是一样的。但是其实它们的内部运行机制不一样,这一点在多重继承时体现得很明显。在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
    注意:super继承只能用于新式类,用于经典类时就会报错。
    新式类:必须有继承的类,如果没什么想继承的,那就继承object
    经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj』

    更详细的参考

    http://blog.csdn.net/johnsonguo/article/details/585193

    总结
      1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,
           产生了一个super对象;
      2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
      3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;
      4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数
           只调用一次(如果每个类都使用super);
      5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一
           个父类函数被调用多次。

  • 相关阅读:
    nodejs事件和事件循环详解
    keycloak集群化的思考
    Python解释器和IPython
    IndexedDB详解
    在onelogin中使用OpenId Connect Implicit Flow
    在onelogin中使用OpenId Connect Authentication Flow
    SAML和OAuth2这两种SSO协议的区别
    wildfly 21的配置文件和资源管理
    【老孟Flutter】2021 年 Flutter 官方路线图
    【老孟Flutter】为什么 build 方法放在 State 中而不是在 StatefulWidget 中
  • 原文地址:https://www.cnblogs.com/renxchen/p/7890648.html
Copyright © 2020-2023  润新知