鱼C论坛

 找回密码
 立即注册
查看: 383|回复: 5

[已解决]请问关于super().__init__函数的相关问题

[复制链接]
发表于 2024-4-21 19:41:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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().是否可以用于继承其他方法(非魔法方法)
最佳答案
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)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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版本中已经无法使用了是吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-21 20:01:18 | 显示全部楼层
15779327169 发表于 2024-04-21 20:00
那怎么说,小甲鱼的哦基础入门学习python第151页的 使 ...


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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-22 19:35:47 | 显示全部楼层
isdkz 发表于 2024-4-21 23:13
首先,你理解错了 super() 的作用,super() 并不是用来继承的,而是帮助子类调用父类的方法的,这在子类需 ...

谢谢大神!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 16:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表