TypeError: missing 1 required positional argument in call to super.__init__()

TypeError: missing 1 required positional argument in call to super.__init__()

我正在编写一个程序来使用继承来查找圆柱体的体积。但是,我收到以下错误,我不确定如何解决它:

TypeError: __init__() missing 1 required positional argument: 'height'

这是我的代码:

class Circle:
    def __init__(self,radius,height):
        self.radius = radius
        self.height = height
    
class Cylinder(Circle):
    def __init__(self,radius,height):
        super().__init__(Circle)
        self.volume = 3.14 * (self.radius ** 2) * self.height
   def set_volume(self):
        print(self.volume)
    
radius = float(input("radius:"))
height = float(input("height:"))
cyl = Cylinder(radius,height)
print("Cylinder volume:", cyl.set.volume())

您对超类 __init__ 的调用不正确。 radius 和 height 参数需要显式传入,而不是传入父类的名字。

super().__init__(Circle)

应该是

super().__init__(radius, height)

我建议你稍微研究一下OOP和类之间的关系,因为继承不是这里的情况,与输出错误无关。

首先,圆柱形是一种 3d 几何形式,可以聚合一个圆或实现另一个圆的接口,但又是独立的。

所以这种形式 不完全是一个家庭 并且不应该 link 继承。

查看此reference,了解有关软件开发中聚合和组合的更多有趣内容。

我给你实现了一个功能代码,只是一个重构。

class Circle:
    def __init__(self, radius):
        self._radius = radius
        self._area = 3.14 * (self._radius ** 2)
    
    @property
    def radius(self):
        return self._radius 

    @property
    def area(self):
        return self._area
    
class Cylinder:
    def __init__(self, radius, height, circle = None):
        self._height = height
        self._circle = circle if circle else Circle(radius)
        self._volume = self._circle.area * self._height

    @property
    def heigth(self):
        return self._height 

    @property
    def volume(self):
        return self._volume

    @property
    def area(self):
        return self._circle.area
    
# radius = float(input("radius:"))
# height = float(input("height:"))
radius = 5
height = 10

circle = Circle(radius)
cylinder = Cylinder(radius, height, circle = circle)

print("circle area:", circle.radius)
print("Cylinder area:", cylinder.area)
print("Cylinder height:", cylinder.heigth)
print("Cylinder volume:", cylinder.volume)

由于高度是与圆柱体相关联的 属性 我们将 height 属性 放在 Cylinder class 和底部 class Circle 只会有 radius 属性.
你最好做的事情如下所示

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
class Cylinder(Circle):
    def __init__(self, radius, height):
        super().__init__(radius)
        self.height = height # It makes sense to put height in the cyclinder here 
        self.volume = 3.14 * (self.radius ** 2) * self.height
   def set_volume(self):
        print(self.volume)
    
radius = float(input("radius:"))
height = float(input("height:"))
cyl = Cylinder(radius, height)
print("Cylinder volume:", cyl.set_volume())

#我指的是正确的代码

class Circle:
    def __init__(self, radius):
    self.radius = radius

class Cylinder(Circle):
    def __init__(self, radius, height):
    super().__init__(radius)
    self.height = height 
    self.volume = 3.14 * (self.radius ** 2) * self.height
    def set_volume(self):
    print("Cylinder volume:",self.volume)

radius = float(input("radius:"))
height = float(input("height:"))
cyl = Cylinder(radius, height)
cyl.set_volume()