我似乎无法从父级“ Circle”类中获取“ r”半径,并在子级“ Cylinder”类中使用它。尝试了多种不同的方式,但似乎找不到我的错误!
class Circle(Point):
def __init__(self, r):
self.r = r
class Cylinder(Circle):
def __init__(self,h):
Circle.__init__(self,r)
self.h = h
此代码会导致以下错误
>>> circle = Circle(5)
>>> cylinder = Cylinder(3)
Traceback (most recent call last):
File "<pyshell#123>", line 1, in <module>
cylinder = Cylinder(3)
File "C:/Users/theco/Desktop/OOP Shape.py", line 49, in __init__
Circle.__init__(self, r)
NameError: name 'r' is not defined
任何帮助将不胜感激!谢谢!
答案 0 :(得分:0)
您的代码存在一些问题。
您不会通过执行Circle
来调用超类Circle.__init__(self,r)
的构造函数,而是通过进行super().__init__(r)
来调用,这意味着我想调用{ {1}}或super
类
您没有在Parent
的构造函数中传递r
,(您只是做Cylinder
,但以某种方式将其传递给__init__(self,h):
的构造函数无法实现,您需要将Circle
和r
都传递给h
的构造函数,例如Cylinder
所以您的固定代码看起来像
__init__(self, r, h):
然后当您相应地调用它时,您会看到它现在可以工作
class Circle(Point):
def __init__(self, r):
self.r = r
class Cylinder(Circle):
#Passing both r and h to Cylinder constructor
def __init__(self,r, h):
#Passing r to Circle Constructor
super().__init__(r)
self.h = h
也只是为了使自己幽默,请尝试分别在circle = Circle(5)
print(circle.r)
#5
cylinder = Cylinder(5, 3)
print(cylinder.r)
#5
print(cylinder.h)
#3
和area
中定义volume
和Circle
函数,您将看到继承的威力
Cylinder
然后您可以按以下方式称呼它们:
import math
class Circle(Point):
def __init__(self, r):
self.r = r
#Area of circle is pi*r*r
def area(self):
return math.pi * self.r * self.r
class Cylinder(Circle):
#Passing both r and h to Cylinder constructor
def __init__(self,r, h):
#Passing r to Circle Constructor
super().__init__(r)
self.h = h
#Volume of cylinder is pi*r*r*h
def volume(self):
return self.area()*self.h
答案 1 :(得分:0)
您需要将r
添加到子构造函数,并使用super
而不是Circle
调用父构造函数
class Circle(Point):
def __init__(self, r):
self.r = r
class Cylinder(Circle):
def __init__(self, r, h): ## added r here
super().__init__(r) # changed Circle to super
self.h = h
您可以通过执行以下操作来创建两个类的实例:
r = 10
h = 20
a = Cylinder(r, h)
b = Circle(r)