• python中super()方法的解释


    在学习 Python 类的时候,会碰见类中有 __init__() 这样一个函数,其实它就是 Python 的构造方法。

    构造方法类似于类似 init() 这种初始化方法,来初始化新创建对象的状态,在一个对象创建后会立即调用,比如像实例化一个类:

    f = FooBar()
    f.init()#手动初始化

    使用构造方法就能让它简化成如下形式:对象创建后自动调用魔法方法__init__(),对对象进行初始化操作

    f = FooBar()

    在明白了构造方法之后,来点进阶的问题,那就是父类的构造方法中的初始值无法继承的问题

    class Bird:
        def __init__(self):
              self.hungry = True
        def eat(self):
              if self.hungry:
                   print 'Ahahahah'
              else:
                   print 'No thanks!'
    
    class SongBird(Bird):
         def __init__(self):
              self.sound = 'Squawk'
         def sing(self):
              print self.song()
    
    sb = SongBird()
    sb.sing()    # 能正常输出
    sb.eat()     # 报错,因为 songgird 中没有 hungry 特性

    解决这个问题的办法有两种:

    1、调用未绑定的超类构造方法(不推荐)

    class SongBird(Bird):
         def __init__(self):
              Bird.__init__(self) #
              self.sound = 'Squawk'
         def sing(self):
              print self.song()

    原理在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。

    2、使用super函数(推荐)

    class SongBird(Bird):
         def __init__(self):
              super(SongBird,self).__init__()
              self.sound = 'Squawk'
         def sing(self):
              print self.song()

    原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。

    super() 函数是用于调用父类(超类)的一个方法。

    super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重

    复调用(钻石继承)等种种问题。

    MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。(菜鸟文档)

     

  • 相关阅读:
    The three toppaying tech roles in 2022 and the skills you need to land them
    Using serilog with azure application insights and .Net core
    炉石传说 佣兵战纪 奥特兰克山谷
    跑步减肥 不同年龄要有不同配速
    聊聊微软面试 超哥的地盘
    风暴英雄上传录像举报
    Node.js Express 框架 规格严格
    redis查询key的数量 规格严格
    MySQL DATE_FORMAT() 函数 规格严格
    fastjson/jackson 转 json Boolean布尔类型 is丢失问题 规格严格
  • 原文地址:https://www.cnblogs.com/hemengjita/p/12584056.html
Copyright © 2020-2023  润新知