Defining attributes of a class using list comprehension gives AttributeError

python class attributes
python class dictionary attribute
python list attributes
python add attribute to class
python getattr
python setattr
python get attributes of object
python object attributes

I want to define a class which calculate the area of the circle and also count the number of circles

input 1,2,3

Output [3.14, 12.56, 28.26]

3

But I am not getting the desired output.

Code used:

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

Gives the following error:

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'

I think you might be misunderstanding when you'd use a class. Think of a class as a template for an object. When you call Circle(...), you create an instance of that object, and it is perfectly acceptable to have multiple instances of one class.

In your example, consider making three circles for each of your three inputs (or however many inputs), then this simplifies your class because you don't need any lists.

class Circle:

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

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

Then your main code would be dealing with each input as its own circle:

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

Note that we need to typecast the radius from a string to an integer so that we can perform calculations on it.

If you need to count the number of circles you create, then that's simply len(list_radius).

In Python, it's all about the attributes — Reuven Lerner, class Foo(object): def __init__(self, x, y): self.x = x self.y = y >> f You can get a list of those attributes using the built-in “dir” function. and “getattr” gives us the flexibility to retrieve an attribute value with a dynamically built string. We can define attributes on each individual instance inside of __init__. A class attribute is a Python variable that belongs to a class rather than a particular object. It is shared between all the objects of this class and it is defined outside the constructor

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

So that, the radius can be float and not string.

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

Here in List comprehension, it should be 3.14*i**2.

Accessing attributes in Python, In this post I want to review the methods that Python provides to access object Every instance of this class will contain three attributes, namely title line 1, in < module> AttributeError: 'Book' object has no attribute 'publisher' >>> a lot of attributes, allowing to write simple for loops or list comprehensions. Here, class_var is a class attribute, and i_var is an instance attribute: class MyClass (object): class_var = 1 def __init__ (self, i_var): self.i_var = i_var. Note that all instances of the class have access to class_var, and that it can also be accessed as a property of the class itself:

Your class should look like this:

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

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

Python Tutorial, The Circle class shall contain a data attribute radius and a method get_area() , as Inspect the "class" object Circle >>> dir(Circle) # List all attributes for Circle object You can also define methods, via the def s, to be shared by all the instances. _radius)) # AttributeError: type object 'Circle' has no attribute '_ radius'. Using list comprehension in functions. Now, let’s see how we can use list comprehension in functions. # Create a function and name it double: def double(x): return x*2 # If you now just print that function with a value in it, it should look like this: >>> print double(10) 20 We can easily use list comprehension on that function.

Typecasting will work in your case.

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

And your class has some indentation mismatch. I think its just while typing out the question.

How to make mistakes in Python – O'Reilly, The Jupyter Notebook gives your browser super powers! It takes just a AttributeError: 'NoneType' object has no attribute 'be_excellent'. In this case When I discovered list comprehensions, I fell in love, and I fell hard. I used them at Count the number of classes defined in a big module… 3: And the� • Class attributes are defined within a class definition and outside of any method • Since there is one of these attributes per class and not one per instance, they’re accessed via a different notation: • Access class attributes using self.__class__.name notation -- This is just one way to do this & the safest in general.

Classes — Python Notes 0.1 documentation, As we mentioned up front, Python is a hybrid language that doesn't force a particular 5) function >>> type(None) NoneType >>> type('hello') str >>> type([1 ,2,3]) list Like in traditional object-oriented languages this means they can have attributes and methods. Let's define our class again but forget self on a method: . The problem with this, however, is that this object doesn’t behave as a dictionary – if you want to use any of the dictionary methods, you need to access __dict__ directly (or use the dictionary that this object was created from). Another approach is to subclass dict and add attribute getter and setter methods:

Undefined class attribute - Python queries, This may result in an AttributeError at run time. Recommendation. Ensure that all attributes are initialized in the __init__ method. Example. The typically way to access an attribute is through an attribute reference syntax form, which is to separate the primary (the object instance) and the attribute identifier name with a period (. For example, person.name would attempt to retrieve the name attribute of the person object.

Python Tutorial: Class vs. Instance Attributes, Object-oriented programming in Python: instance attributes vs. class attributes and their proper usage. We define class attributes outside all the methods, usually they are placed at This method should give some general class information. Advanced � Lambda Operator, Filter, Reduce and Map � List Comprehension� Can we assign an attribute to a class? Sure we can: >>> Foo.bar = 100 >>> Foo.bar 100. Classes are objects, and thus classes have attributes. But it seems a bit annoying and roundabout for us to define attributes on our class in this way. We can define attributes on each individual instance inside of __init__.

Comments
  • You need to document what you've tried, where it is failing, and what your output currently is.
  • I took a liberty of adding an output produced by your code and changing the title accordingly. If you don't agree with my edit, feel free to reverse it.
  • I think it's worth to note that if a class has two methods, and one of them is __init__ then it shouldn't be a class.