15779327169 发表于 2024-4-21 19:41:57

请问关于super().__init__函数的相关问题

class Fater:
    def __init__(self,name,age):
      self.name = name
      self.age = age

    def __str__(self):
      return "%s的年龄是:%d"%(self.name,self.age)

class Son(Fater):
    def __init__(self,name,caleac):
      super().__init__(name)
      self.caleac = caleac

    def __str__(self):
      return ":%s,所在大学是%s"%(self.name,self.caleac)

fater = Fater('Tom',50)
print(fater)
son = Son('jake','集美大学')
print(son)

问题1:如果我这里Son类只想继承Fater类的name属性,这样写为什么报错,应该如何写
问题2,:请问为什么我跟着小甲鱼教程里直接写super().__init__(),最终会报错,提示我__init__()内缺少参数
问题3:请简述以下super().__init__()中的具体参数以及如何应用,另外super().是否可以用于继承其他方法(非魔法方法)

FishC 发表于 2024-4-21 19:42:13

问题1:如果你只想让Son类继承Fater类的name属性,可以将Son类的__init__方法中的super().__init__(name)修改为super().__init__(name, age=None)。这样一来,你在Son类中初始化父类时只需要传入name属性即可,而age属性可以传入None或者不传入。

修改后的代码如下:

class Father:
    def __init__(self, name, age):
      self.name = name
      self.age = age

    def __str__(self):
      return "%s的年龄是:%d" % (self.name, self.age)

class Son(Father):
    def __init__(self, name, caleac):
      super().__init__(name, age=None)
      self.caleac = caleac

    def __str__(self):
      return ":%s,所在大学是%s" % (self.name, self.caleac)

father = Father('Tom', 50)
print(father)
son = Son('jake', '集美大学')
print(son)

问题2:在你的代码中,你使用了`super().__init__(name)`这样的写法,在Python3中会报错,因为你在父类的`__init__`方法中还有一个age参数,但是你没有传入。所以正确的写法应该是`super().__init__(name, age)`。

问题3:`super().__init__()`中的具体参数是父类的构造函数中的所有参数,包括self。通过`super().`可以调用父类的构造函数,从而完成对父类属性的初始化。如果子类中定义了与父类同名的方法,则可以通过`super().method_name()`来调用父类的方法。

需要注意的是,`super()`只能用于调用父类的方法,不能用于调用其他非魔法方法。但是,如果你想要调用父类的其他非魔法方法,可以通过`super()`来获取父类的对象,然后再调用相应的方法。例如:`super().父类方法名()`。

希望能帮到你,如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

15779327169 发表于 2024-4-21 20:00:40

FishC 发表于 2024-4-21 19:42
问题1:如果你只想让Son类继承Fater类的name属性,可以将Son类的__init__方法中的super().__init__(name)修 ...

那怎么说,小甲鱼的哦基础入门学习python第151页的 使用super函数章节里,对鲨鱼Shark()类继承Fish()类时,使用的
class Shark(Fish):
    def __init__(self):
      super().__init__()

这个写法在python3.7版本中已经无法使用了是吗

FishC 发表于 2024-4-21 20:01:18

15779327169 发表于 2024-04-21 20:00
那怎么说,小甲鱼的哦基础入门学习python第151页的 使 ...

很抱歉给您带来的困惑。在Python3.7版本中,使用`super().__init__()`是可以正常工作的,前提是子类的构造函数没有额外的参数。

如果子类构造函数有额外的参数,那么在调用父类的构造函数时,必须将这些参数一并传递进去。在之前的回答中,我也提到了这一点。

对于您提到的例子,如果Shark类的构造函数没有其他参数,那么`super().__init__()`是可以正常工作的。只要确保Fish类的构造函数没有额外的参数即可。

再次感谢您的指正,如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

isdkz 发表于 2024-4-21 23:13:33

首先,你理解错了 super() 的作用,super() 并不是用来继承的,而是帮助子类调用父类的方法的,这在子类需要重写父类的方法时会很有帮助

你想调用父类的初始化方法来给子类初始化 name 属性,但是又不想保留 age 属性,可以这样做,但是这样做的意义不大:
class Fater:
    def __init__(self,name,age):
      self.name = name
      self.age = age
    def __str__(self):
      return "%s的年龄是:%d"%(self.name,self.age)

class Son(Fater):
    def __init__(self,name,caleac):
      super().__init__(name, None)
      self.__dict__ = { k: v for k, v in self.__dict__.items() if v != None }
      self.caleac = caleac
    def __str__(self):
      return ":%s,所在大学是%s"%(self.name,self.caleac)

fater = Fater('Tom',50)
print(fater)
son = Son('jake','集美大学')
print(son)

15779327169 发表于 2024-4-22 19:35:47

isdkz 发表于 2024-4-21 23:13
首先,你理解错了 super() 的作用,super() 并不是用来继承的,而是帮助子类调用父类的方法的,这在子类需 ...

谢谢大神!
页: [1]
查看完整版本: 请问关于super().__init__函数的相关问题