Instance 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 to run code changes when we use instance attributes in Python.
We want to know how accessing or setting these attributes affects the program's speed as we work with more objects.
Analyze the time complexity of the following code snippet.
class Dog:
def __init__(self, name):
self.name = name
dogs = []
n = 10 # Added definition for n
for i in range(n):
dogs.append(Dog(f"Dog{i}"))
for dog in dogs:
print(dog.name)
This code creates n Dog objects, each with a name stored as an instance attribute, then prints each dog's name.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Creating Dog objects and accessing their
nameattribute inside loops. - How many times: Both loops run n times, once for each dog.
As n grows, the number of Dog objects created and names accessed grows the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 operations (10 creations + 10 name accesses) |
| 100 | About 200 operations |
| 1000 | About 2000 operations |
Pattern observation: The total work grows directly with n, doubling n doubles the work.
Time Complexity: O(n)
This means the time to create and access instance attributes grows in a straight line as we add more objects.
[X] Wrong: "Accessing instance attributes inside a loop is constant time no matter how many objects there are."
[OK] Correct: While each attribute access is quick, doing it for many objects adds up, so total time grows with the number of objects.
Understanding how instance attributes affect time helps you explain object behavior clearly and shows you know how programs scale with data size.
What if we added a nested loop to access attributes multiple times per object? How would the time complexity change?
Practice
Solution
Step 1: Understand instance attributes
Instance attributes are variables that belong to each object separately, not shared.Step 2: Differentiate from class attributes
Class attributes are shared by all objects, but instance attributes hold unique data per object.Final Answer:
A variable that stores data unique to each object -> Option DQuick Check:
Instance attribute = unique data per object [OK]
- Confusing instance attributes with class attributes
- Thinking methods are attributes
- Assuming all objects share the same attribute values
Solution
Step 1: Identify instance attribute syntax
Instance attributes are set inside __init__ using self.attribute = value.Step 2: Check each option
self.name = "Alice" inside __init__ method uses self.name = "Alice" inside __init__, which is correct. Others are class attributes, methods, or invalid.Final Answer:
self.name = "Alice" inside __init__ method -> Option CQuick Check:
Instance attribute = self.attribute inside __init__ [OK]
- Defining attributes outside __init__ without self
- Using class.attribute instead of self.attribute
- Confusing methods with attributes
class Dog:
def __init__(self, name):
self.name = name
dog1 = Dog("Buddy")
dog2 = Dog("Max")
print(dog1.name)
print(dog2.name)Solution
Step 1: Understand instance attribute assignment
dog1.name is set to "Buddy" and dog2.name is set to "Max" separately.Step 2: Print instance attributes
Printing dog1.name outputs "Buddy" and dog2.name outputs "Max".Final Answer:
Buddy Max -> Option AQuick Check:
Each object has its own name attribute [OK]
- Assuming all objects share the same attribute
- Mixing up the order of print statements
- Confusing class and instance attributes
class Car:
def __init__(self, model):
model = model
car = Car("Tesla")
print(car.model)Solution
Step 1: Check attribute assignment in __init__
The code assigns model = model, which only assigns local variable, not instance attribute.Step 2: Accessing car.model causes error
Since self.model is never set, car.model does not exist, causing AttributeError.Final Answer:
AttributeError because model is not set as instance attribute -> Option AQuick Check:
Use self.model = model to set instance attribute [OK]
- Forgetting self. when assigning attributes
- Assuming local variable sets instance attribute
- Expecting attribute to exist without self
Book where each book has a title and a list of authors. How do you correctly set instance attributes so each book has its own authors list without sharing it between objects?Solution
Step 1: Avoid shared mutable class attributes
Setting authors = [] as class attribute shares the same list across all objects, causing bugs.Step 2: Initialize instance attribute inside __init__
Setting self.authors = [] inside __init__ creates a new list for each object, avoiding sharing.Final Answer:
Set self.authors = [] inside __init__ method -> Option BQuick Check:
Mutable instance attributes must be set inside __init__ [OK]
- Using mutable default arguments in method parameters
- Defining mutable attributes as class variables
- Not initializing mutable attributes per instance
