Определение атрибутов класса с использованием понимания списка дает AttributeError - PullRequest
0 голосов
/ 27 марта 2019

Я хочу определить класс, который вычисляет площадь круга, а также подсчитывает количество кругов

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 ]

1 голос
/ 27 марта 2019

Я думаю, вы можете неправильно понимать, когда будете использовать класс. Думайте о классе как о шаблоне для объекта. Когда вы вызываете Circle(...), вы создаете экземпляр этого объекта, и вполне допустимо иметь несколько экземпляров одного класса.

В вашем примере рассмотрите возможность сделать три круга для каждого из ваших трех входов (или любого другого входа), тогда это упростит ваш класс, потому что вам не нужны никакие списки.

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).

0 голосов
/ 27 марта 2019

Typecasting будет работать в вашем случае.

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

И у вашего класса есть некоторое несоответствие отступов.Я думаю, что это просто при наборе вопроса.

0 голосов
/ 27 марта 2019

Ваш класс должен выглядеть так:

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

    def area(self):
        return [3.14 * r**2 for r in self.radius]
0 голосов
/ 27 марта 2019
inputradiusstr="1,2,3"
list_radius=[float(item) for item in inputradiusstr.split(',')]

Так что радиус может быть float, а не string.

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

Здесь, в понимании Списка, должно быть 3.14*i**2.

...