tania2046 发表于 2023-10-18 23:14:36

super未继承,是为啥呢?

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'

请问为啥呢?

isdkz 发表于 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('大象')


这样修改后,程序将会输出预期的结果:

这是一类冰箱
这是一类双开门冰箱
在冰箱中装入大象

陶远航 发表于 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
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 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__() 调用了父类的构造函数,实现了继承效果。运行代码后,输出结果如下:


这是一类冰箱
这是一类双开门冰箱
在冰箱中装入大象


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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: super未继承,是为啥呢?