请问关于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().是否可以用于继承其他方法(非魔法方法) 问题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 小助理,如未能正确解答您的问题,请继续追问。 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版本中已经无法使用了是吗 15779327169 发表于 2024-04-21 20:00
那怎么说,小甲鱼的哦基础入门学习python第151页的 使 ...
很抱歉给您带来的困惑。在Python3.7版本中,使用`super().__init__()`是可以正常工作的,前提是子类的构造函数没有额外的参数。
如果子类构造函数有额外的参数,那么在调用父类的构造函数时,必须将这些参数一并传递进去。在之前的回答中,我也提到了这一点。
对于您提到的例子,如果Shark类的构造函数没有其他参数,那么`super().__init__()`是可以正常工作的。只要确保Fish类的构造函数没有额外的参数即可。
再次感谢您的指正,如果还有其他问题,请随时提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 首先,你理解错了 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) isdkz 发表于 2024-4-21 23:13
首先,你理解错了 super() 的作用,super() 并不是用来继承的,而是帮助子类调用父类的方法的,这在子类需 ...
谢谢大神!
页:
[1]