Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Understanding Private Attributes in Python
📖 Scenario: Imagine you are creating a simple bank account system. You want to keep the account balance safe so that it cannot be changed directly from outside the account. This is where private attributes help.
🎯 Goal: You will create a class with a private attribute for the account balance. Then, you will add a method to safely check the balance.
📋 What You'll Learn
Create a class called BankAccount
Add a private attribute called __balance with the value 1000
Add a method called get_balance that returns the value of __balance
Create an object called account from the BankAccount class
Print the balance using the get_balance method
💡 Why This Matters
🌍 Real World
Private attributes help protect important data inside objects, like bank balances, so they cannot be changed accidentally or by mistake.
💼 Career
Understanding private attributes is important for writing safe and reliable code in many programming jobs, especially when working with classes and objects.
Progress0 / 4 steps
1
Create the BankAccount class with a private balance
Create a class called BankAccount with a private attribute __balance set to 1000 inside the __init__ method.
Python
Hint
Use self.__balance = 1000 inside the __init__ method to create a private attribute.
2
Add a method to get the balance
Inside the BankAccount class, add a method called get_balance that returns the private attribute __balance.
Python
Hint
Define get_balance to return self.__balance.
3
Create an account object
Create an object called account from the BankAccount class.
Python
Hint
Create the object by writing account = BankAccount().
4
Print the account balance
Use the print function to display the balance by calling account.get_balance().
Python
Hint
Print the balance by calling account.get_balance().
Practice
(1/5)
1. What is the main purpose of using private attributes (starting with __) in a Python class?
easy
A. To speed up the program execution
B. To hide the attribute from outside the class and protect it
C. To make the attribute accessible everywhere
D. To make the attribute a global variable
Solution
Step 1: Understand private attribute naming
Private attributes start with double underscores to hide them from outside access.
Step 2: Purpose of hiding attributes
This protects the data inside the object from accidental or unauthorized changes.
Final Answer:
To hide the attribute from outside the class and protect it -> Option B
Quick Check:
Private attributes = data protection [OK]
Hint: Private attributes start with __ to hide data inside class [OK]
Common Mistakes:
Thinking private means accessible everywhere
Confusing private with global variables
Believing private speeds up code
2. Which of the following is the correct way to define a private attribute named age in a Python class?
easy
A. self.___age
B. self.age
C. self._age
D. self.__age
Solution
Step 1: Identify private attribute syntax
Private attributes start with exactly two underscores, like __age.
Step 2: Check options
self.__age uses self.__age, which is correct. self.age is public, self._age is protected (single underscore), self.___age has three underscores which is invalid.
Final Answer:
self.__age -> Option D
Quick Check:
Private attribute = double underscore [OK]
Hint: Private attribute = double underscore before name [OK]
Common Mistakes:
Using single underscore instead of double
Adding too many underscores
Forgetting underscores
3. What will be the output of this code?
class Person:
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
p = Person('Anna')
print(p.get_name())
print(p.__name)
medium
A. Anna\nAnna
B. AttributeError\nAnna
C. Anna\nAttributeError
D. AttributeError\nAttributeError
Solution
Step 1: Understand private attribute access
The attribute __name is private and cannot be accessed directly outside the class.
Step 2: Check print statements
Calling p.get_name() returns 'Anna' correctly. But p.__name causes AttributeError because it's private.
Final Answer:
Anna\nAttributeError -> Option C
Quick Check:
Private attribute direct access = AttributeError [OK]
Hint: Private attributes cause error if accessed directly outside class [OK]
Common Mistakes:
Expecting direct access to private attribute
Ignoring AttributeError on private access
Confusing method call with attribute access
4. Find the error in this code and fix it:
class Car:
def __init__(self, model):
self.__model = model
c = Car('Tesla')
print(c.__model)
medium
A. Add a method inside class to return __model
B. No error, code runs fine
C. Remove underscores from __model
D. Change __model to _model to fix access
Solution
Step 1: Identify the error
Accessing c.__model outside the class causes AttributeError because __model is private.
Step 2: Fix by adding a getter method
Adding a method inside the class to return self.__model allows safe access.
Final Answer:
Add a method inside class to return __model -> Option A
Quick Check:
Private attribute access needs class method [OK]
Hint: Use class method to access private attributes outside class [OK]
Common Mistakes:
Trying to access private attribute directly
Removing underscores breaks privacy
Ignoring need for getter method
5. You want to store a private attribute __balance in a BankAccount class and allow safe updating only through a method that adds money. Which code snippet correctly implements this?
hard
A. class BankAccount:
def __init__(self):
self.__balance = 0
def add_money(self, amount):
self.__balance += amount
def get_balance(self):
return self.__balance
B. class BankAccount:
def __init__(self):
self._balance = 0
def add_money(self, amount):
self._balance += amount
def get_balance(self):
return self._balance
C. class BankAccount:
def __init__(self):
self.balance = 0
def add_money(self, amount):
self.balance += amount
def get_balance(self):
return self.balance
D. class BankAccount:
def __init__(self):
self.__balance = 0
def add_money(self, amount):
self.balance += amount
def get_balance(self):
return self.__balance