Python 3编写类以返回表面积和球体积

时间:2013-04-22 06:52:34

标签: python python-3.x geometry volume

我已经尝试了一切,我的代码似乎非常接近,但是当我定义变量时,我不断收到名称错误。

from math import *

class Spheres:
    def __init__(self, radius):
        self.radius = r
        self.area = 0
        self.volume = 0

    def getRadius(self):
        return self.radius

    def surfaceArea(self):
        self.area = 4 * 3.14 * (r*r)
        return (self.area)

    def getVolume(self):
        self.volume = (4/3) * 3.14 * (r * r * r)
        return (self.volume)


def main():
    r = input("Enter the radius of the sphere: ")
    s = Spheres(r)
    print("The volume of the sphere is: ", s.surfaceArea())
    print("The surface area of the sphere is: ", s.volume())

if __name__ == '__main__':
    main()

我得到的错误信息是:

Traceback (most recent call last): 
  File "/local/files/jfult001/CSC221/lab10/9ball.py", line 30, in <module> main() 
  File "/local/files/jfult001/CSC221/lab10/9ball.py", line 26, in main print("The volume of the sphere is: ", s.surfaceArea()) 
  File "/local/files/jfult001/CSC221/lab10/9ball.py", line 15, in surfaceArea self.area = 4 * 3.14 * (r*r) 
NameError: global name 'r' is not defined 

3 个答案:

答案 0 :(得分:3)

def surfaceArea(self):
    self.area = 4 * 3.14 * (r*r)
    return (self.area)

def getVolume(self):
    self.volume = (4/3) * 3.14 * (r * r * r)
    return (self.volume)

在上面的函数中,将所有r更改为self.radius因为self.radius是您班级的相应属性而不是...

您的__init__也有一些小错误,请按照以下方式更正您的课程:

class Spheres:
    def __init__(self, r):
        self.radius = r
        self.area = 0
        self.volume = 0

    def getRadius(self):
        return self.radius

    def surfaceArea(self):
        r=self.radius
        self.area = 4 * 3.14 * (r*r)
        return (self.area)

    def getVolume(self):
        r=self.radius
        self.volume = (4/3) * 3.14 * (r * r * r)
        return (self.volume)

答案 1 :(得分:1)

让我告诉你范围

在Python中,变量作用域或受限于它们所定义的代码。例如,以下代码:

def my_function():
    r = 1234

print r

这会为您提供NameError,因为r 本地my_function(),并且在my_function()之外不存在。

类似地:

class MyClass(object):

    def __init__(self, r):
        self.radius = r

    def access_r(self):
        return r

m = MyClass(1234)
m.access_r()

此代码还会为您提供NameError,因为r仅在__init__()的范围内定义。

请注意,在上例中,您有self.radius = r。恰好可以在两个函数中访问selfr的值存储在self.radius中,以便从同一类内的其他函数中访问它。进行以下修改,例如:

class MyClass(object):

    def __init__(self, r):
        self.radius = r

    def access_r(self):
        return self.radius

m = MyClass(1234)
print m.access_r()

此代码将顺利运行返回1234r的值。

答案 2 :(得分:0)

看起来'r'是作为字符串输入的。

我会写r = float(输入(“输入半径:”))