Home › Problems › Counter object adds up
Counter object adds up
🧠 Predict the output Topic: oop Difficulty: medium Free
What this problem practises
Object-oriented bugs hide in state: class attributes shared by every instance, mutable defaults declared in __init__ signatures, and methods that mutate self when the caller expected a copy.
This is an output-prediction problem: read the snippet carefully and write down exactly what it prints before anything runs. These questions are interview staples because they test whether you know the language rules, or merely recognise their syntax.
Difficulty: medium — expect to hold two interacting rules in your head at once, such as a boundary combined with a mutation.
The challenge
What will this program print? Type the exact output.
The code runs in PyDebug’s in-browser compiler. Open the problem, run the snippet, watch the exact error or output, and keep iterating until it is right. Signed-in solves count toward XP and your daily streak.
The snippet
The interactive editor pre-fills exactly this code — read it, then submit your prediction:
class Counter:
def __init__(self):
self.count = 0
def add(self, n):
self.count += n
c = Counter()
c.add(10)
c.add(3)
print(c.count)Understand the rule
Object-oriented output questions test whether you track state attached to `self` across multiple method calls. Unlike local variables inside a regular function, attributes stored on `self` persist in memory for the lifetime of that specific object instance.
How to trace it
- Instantiating the class runs `__init__`, initializing the starting numeric attribute on `self`.
- Each mutating method call (`inc()`, `add()`, or `reset()`) reads the current `self` attribute and writes the updated value back to the same instance.
- If two separate instances exist, mutations on one instance leave the second instance's `self` dictionary untouched.
- Finally, `print()` reads the accumulated attribute value after the entire sequence of method calls finishes.
Common wrong fixes
- Resetting the attribute back to its `__init__` default mentally on every method call as if it were a stateless function.
- Confusing a class attribute shared across all instances with an instance attribute assigned on `self` inside `__init__`.
- Overlooking a method that both mutates `self` and returns a value, or mutates `self` and returns `None`.
Rule to remember
Draw a small box for each object instance and cross out old `self.value` numbers as each method executes in order.
More oop problems
- Duck overrides speak() medium
- AttributeError: missing self medium
- Counter object adds up medium
Keep going
- Output-prediction strategies — how to predict tricky snippets without running them.
- Browse every oop problem in this topic.
- Common Python errors and what they actually mean, plus the Python glossary for any term used on this page.