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