鱼C论坛

 找回密码
 立即注册
查看: 1378|回复: 3

[已解决]super未继承,是为啥呢?

[复制链接]
发表于 2023-10-18 23:14:36 | 显示全部楼层 |阅读模式

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

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

x
class Fridge2():
    def __init__(self):
        print('这是一类冰箱')
    def pack1(self,goods):
        self.goods=goods
        print('在冰箱中装入%s'%self.goods)
class Doublefridge():
    def __init__(self):
        super().__init__(self.pack)
        print('这是一类双开门冰箱')
fridge=Doublefridge()
fridge.pack('大象')

这是一段复写书上的代码,按书上的显示应该会print
这是一类冰箱
这是一类双开门冰箱
在冰箱中装入大象

但程序却报错:AttributeError: 'Doublefridge' object has no attribute 'pack'

请问为啥呢?
最佳答案
2023-10-18 23:14:49
问题出在Doublefridge类的初始化方法中的super()函数调用上。在Python中,super()函数用于调用父类的方法,但是它并不是用于调用父类的构造方法的。在这段代码中,Doublefridge类的初始化方法中调用了super().__init__(self.pack),但是这样的调用是错误的。

在Doublefridge类中,它并没有直接继承Fridge2类,所以它也没有继承Fridge2类的方法和属性。因此,Doublefridge类中没有名为pack的方法,导致了AttributeError: 'Doublefridge' object has no attribute 'pack'的错误。

要解决这个问题,你可以将Doublefridge类直接继承自Fridge2类,这样Doublefridge类就能够继承Fridge2类的方法和属性。修改代码如下:
class Doublefridge(Fridge2):
    def __init__(self):
        super().__init__()
        print('这是一类双开门冰箱')

fridge = Doublefridge()
fridge.pack1('大象')

这样修改后,程序将会输出预期的结果:
这是一类冰箱
这是一类双开门冰箱
在冰箱中装入大象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-18 23:14:49 | 显示全部楼层    本楼为最佳答案   
问题出在Doublefridge类的初始化方法中的super()函数调用上。在Python中,super()函数用于调用父类的方法,但是它并不是用于调用父类的构造方法的。在这段代码中,Doublefridge类的初始化方法中调用了super().__init__(self.pack),但是这样的调用是错误的。

在Doublefridge类中,它并没有直接继承Fridge2类,所以它也没有继承Fridge2类的方法和属性。因此,Doublefridge类中没有名为pack的方法,导致了AttributeError: 'Doublefridge' object has no attribute 'pack'的错误。

要解决这个问题,你可以将Doublefridge类直接继承自Fridge2类,这样Doublefridge类就能够继承Fridge2类的方法和属性。修改代码如下:
class Doublefridge(Fridge2):
    def __init__(self):
        super().__init__()
        print('这是一类双开门冰箱')

fridge = Doublefridge()
fridge.pack1('大象')

这样修改后,程序将会输出预期的结果:
这是一类冰箱
这是一类双开门冰箱
在冰箱中装入大象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-18 23:15:35 | 显示全部楼层
这个问题的原因在于你的Doublefridge类并没有继承Fridge2类,所以Doublefridge类中并没有pack方法。super()函数是用来调用父类(超类)的一个方法,但是Doublefridge并没有父类,所以这里使用super()会出错。

另外,你在Doublefridge__init__方法中调用了self.pack,但是Doublefridge类中并没有定义pack方法,所以会报AttributeError: 'Doublefridge' object has no attribute 'pack'这个错误。

如果你想让Doublefridge类有pack方法,并且能够打印出你想要的结果,你应该让Doublefridge类继承Fridge2类,代码应该修改为:
class Fridge2():
    def __init__(self):
        print('这是一类冰箱')
    def pack(self,goods):
        self.goods=goods
        print('在冰箱中装入%s'%self.goods)

class Doublefridge(Fridge2):
    def __init__(self):
        super().__init__()
        print('这是一类双开门冰箱')

fridge=Doublefridge()
fridge.pack('大象')

这样,当你创建一个Doublefridge对象并调用pack方法时,它会先调用Fridge2类的__init__方法,然后打印出'这是一类冰箱',然后打印出'这是一类双开门冰箱',最后调用Fridge2类的pack方法,打印出'在冰箱中装入大象'。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-18 23:16:09 | 显示全部楼层
super未继承报错的原因

在您提供的代码中,出现了报错 AttributeError: 'Doublefridge' object has no attribute 'pack' 的问题。这是因为 Doublefridge 类没有直接继承 Fridge2 类,所以无法访问 Fridge2 类中定义的方法 pack()

super() 函数用于在子类中调用父类的方法或构造函数。然而,在 Doublefridge 类的构造函数中使用 super().__init__(self.pack) 是不正确的。如果想要继承 Fridge2 类的属性和方法,需要通过类的继承来实现。

下面是修改后的代码示例:
class Fridge2:    def __init__(self):        print('这是一类冰箱')            def pack1(self, goods):        self.goods = goods        print('在冰箱中装入%s' % self.goods)class Doublefridge(Fridge2):  # 继承Fridge2类    def __init__(self):        super().__init__()  # 调用父类的构造函数        print('这是一类双开门冰箱')fridge = Doublefridge()fridge.pack1('大象')
修改后的代码中,Doublefridge 类继承了 Fridge2 类,通过 super().__init__() 调用了父类的构造函数,实现了继承效果。运行代码后,输出结果如下:

[/code]
这是一类冰箱
这是一类双开门冰箱
在冰箱中装入大象
[/code]

希望以上解释能够解决您的问题。如果还有其他疑问,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 03:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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