试图从父类“ NameError:未定义名称'r'”继承变量

时间:2019-05-02 02:27:13

标签: python-3.x

我似乎无法从父级“ 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

任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

  1. 您不会通过执行Circle来调用超类Circle.__init__(self,r)的构造函数,而是通过进行super().__init__(r)来调用,这意味着我想调用{ {1}}或super

  2. 您没有在Parent的构造函数中传递r,(您只是做Cylinder,但以某种方式将其传递给__init__(self,h):的构造函数无法实现,您需要将Circler都传递给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中定义volumeCircle函数,您将看到继承的威力

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)