使用列表推导定义类的属性会产生AttributeError

时间:2019-03-27 09:23:16

标签: python oop attributes list-comprehension

我想定义一个类,该类可以计算圆的面积并计算圆的数量

input 1,2,3

Output [3.14, 12.56, 28.26]

3

但是我没有得到想要的输出。

使用的代码:

class Circle:
    def __init__(self, radius):
        [self.radius for i in radius]  

    def area(self):
        return [3.14*self.radius**2 for i in self.radius]
        # return 3.14 * self.radius ** 2

inputradiusstr = "1,2,3"
list_radius = inputradiusstr.split(',')
obj2 = Circle(list_radius)
print(obj2.area())

给出以下错误:

Traceback (most recent call last):
  File "path/to/file.py", line 11, in <module>
    obj2=Circle(list_radius)
  File "path/to/file.py", line 3, in __init__
    [self.radius for i in radius]
  File "path/to/file.py", line 3, in <listcomp>
    [self.radius for i in radius]
AttributeError: 'Circle' object has no attribute 'radius'

4 个答案:

答案 0 :(得分:1)

我认为您上课时可能会误会。将类视为对象的模板。调用Circle(...)时,将创建该对象的 instance ,并且完全可以接受一个类的多个实例。

在您的示例中,考虑为三个输入(或输入很多)中的每个输入制作三个圆圈,这将简化您的班级,因为您不需要任何列表。

class Circle:

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

    def area(self):
        return 3.14 * self.radius**2

然后,您的主要代码将把每个输入当作自己的圈:

inputradiusstr="1,2,3"
list_radius=inputradiusstr.split(',')
for radius in list_radius:
    c = Circle(int(radius))
    print(c.area())

请注意,我们需要将半径从字符串类型转换为整数,以便可以对其进行计算。

如果您需要计算创建的圆圈数,则只需len(list_radius)

答案 1 :(得分:0)

inputradiusstr="1,2,3"
list_radius=[float(item) for item in inputradiusstr.split(',')]

因此,半径可以是浮点数,而不是字符串。

  def area(self):
    return [3.14*self.radius**2 for i in self.radius]
    #return 3.14 * self.radius **2

在列表理解中,它应该为3.14*i**2

答案 2 :(得分:0)

您的课程应如下所示:

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

    def area(self):
        return [3.14 * r**2 for r in self.radius]

答案 3 :(得分:0)

类型转换适用于您的情况。

inputradiusstr="1,2,3"
list_radius=list(map(int,inputradiusstr.split(',')))
obj2=Circle(list_radius)
print(obj2.area())

您的班级的缩进不匹配。我认为是在输入问题时。