代码之家  ›  专栏  ›  技术社区  ›  Pythonist

通过提供父构造函数所需的较少参数的super()重写构造函数

  •  1
  • Pythonist  · 技术社区  · 5 年前

    我在读这个 tutorial about inheritance

    class Fish:
        def __init__(self, first_name, last_name="Fish"):
            self.first_name = first_name
            self.last_name = last_name            
    
    class Trout(Fish):
        def __init__(self, water = "freshwater"):
            self.water = water
            super().__init__(self)
    

    令人惊讶的是(对我来说),您可以创建 Trout 没有给它起任何名字,也不会引发例外。我不明白为什么 super().__init__(self) 不会失败。父类的构造函数 要求 这个 first_name 参数!为什么不允许创建Fish的实例而不给它一个名称(即。 Fish() 失败),但您可以从子类中调用相同的构造函数而不会出现问题(即。 Trout() 工作)!?

    class Trout(Fish):
        def __init__(self, first_name, water = "freshwater"):
            self.water = water
            super().__init__(self, first_name)
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Cameron McFee    5 年前

    你已经通过了 self super().__init__ <__main__.Trout object at 0x7f93635e8130> 在方法调用中隐含,因此 自己

    编辑以添加(我意识到这不是非常清楚):

    class Fish:
        def __init__(self, first_name, last_name="Fish"):
            self.first_name = first_name
            self.last_name = last_name            
    
    class Trout(Fish):
        def __init__(self, first_name, water = "freshwater"):
            self.water = water
            super().__init__(first_name) # note that self is not required here