Class attributes in Python - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
Let's see how the time it takes to run code with class attributes changes as we create more objects.
We want to know how the program's work grows when using class attributes in multiple instances.
Analyze the time complexity of the following code snippet.
class Dog:
legs = 4 # class attribute
def __init__(self, name):
self.name = name # instance attribute
def bark(self):
return f"{self.name} says woof!"
# Creating multiple Dog objects
n = 10 # example value for n
dogs = [Dog(f"Dog{i}") for i in range(n)]
This code defines a class with a shared class attribute and creates a list of dog objects.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Creating
nDog objects in a loop. - How many times: The loop runs
ntimes, once for each dog.
Each new dog object takes a small, fixed amount of work to create.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 object creations |
| 100 | About 100 object creations |
| 1000 | About 1000 object creations |
Pattern observation: The work grows directly with the number of objects created.
Time Complexity: O(n)
This means the time to create all dog objects grows in a straight line as you add more dogs.
[X] Wrong: "Accessing a class attribute inside each object makes the program slower as more objects are created."
[OK] Correct: Class attributes are shared and stored once, so accessing them does not add extra work per object beyond creating the object itself.
Understanding how class attributes affect performance helps you write clear and efficient object-oriented code, a useful skill in many programming tasks.
"What if we added a loop inside the bark method that runs m times? How would the time complexity change when creating and using n dogs?"
Practice
class Car: wheels = 4Here, what does
wheels represent?Solution
Step 1: Identify the attribute location
The attributewheelsis defined inside the class but outside any method.Step 2: Understand class attribute behavior
Attributes defined this way are shared by all instances of the class.Final Answer:
A value shared by all Car objects -> Option AQuick Check:
Class attribute = shared value [OK]
- Thinking class attributes are unique per object
- Confusing class attributes with instance attributes
- Assuming class attributes are methods
color with value "red" inside a class Fruit?Solution
Step 1: Identify class attribute syntax
A class attribute is defined directly inside the class, outside any method.Step 2: Check each option
class Fruit: color = "red" correctly definescoloras a class attribute. class Fruit: def __init__(self): color = "red" defines a local variable inside__init__. class Fruit: def color(self): return "red" defines a method, not an attribute. class Fruit: def __init__(self, color): self.color = color defines an instance attribute.Final Answer:
class Fruit: color = "red" -> Option DQuick Check:
Class attribute = direct assignment inside class [OK]
- Defining attribute inside __init__ without self
- Confusing methods with attributes
- Using self for class attributes
class Dog:
species = "Canine"
dog1 = Dog()
dog2 = Dog()
Dog.species = "Wolf"
print(dog1.species)
print(dog2.species)Solution
Step 1: Understand class attribute change
The attributespeciesis a class attribute shared by all instances.Step 2: Effect of changing class attribute
ChangingDog.speciesto "Wolf" updates the value for all instances that don't have their ownspeciesattribute.Final Answer:
Wolf\nWolf -> Option CQuick Check:
Changing class attribute affects all instances [OK]
- Thinking instances keep old class attribute values
- Confusing instance and class attributes
- Expecting different outputs for dog1 and dog2
class Book:
pages = 100
def __init__(self, pages):
pages = pages
b = Book(200)
print(b.pages)Solution
Step 1: Analyze __init__ method
The linepages = pagesassigns the parameter to itself, not to the instance.Step 2: Understand instance attribute setting
To set an instance attribute, it should beself.pages = pages. Withoutself., the instance attribute is not created.Final Answer:
The instance attribute pages is not set properly -> Option AQuick Check:
Use self.pages to set instance attribute [OK]
- Forgetting self. when assigning instance attributes
- Assuming parameter assignment sets instance attribute
- Confusing class and instance attributes
Student are created using a class attribute count. Which code correctly updates count each time a new Student is made?Solution
Step 1: Identify class attribute usage
countis a class attribute, so it should be accessed via the class name inside methods.Step 2: Check each option for correct increment
class Student: count = 0 def __init__(self): Student.count += 1 usesStudent.count += 1, correctly updating the class attribute. class Student: count = 0 def __init__(self): self.count += 1 tries to incrementself.count, which creates an instance attribute instead. Options C and D have syntax or scope errors.Final Answer:
class Student: count = 0 def __init__(self): Student.count += 1 -> Option BQuick Check:
Update class attribute via ClassName.attribute [OK]
- Using self.attribute to update class attribute
- Defining count inside __init__ instead of class
- Forgetting to use class name to access class attribute
