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 Protected Attributes in Python Classes
📖 Scenario: Imagine you are creating a simple program to manage a library's book information. You want to keep some details safe from being changed directly by mistake, but still allow access when needed.
🎯 Goal: You will create a Python class with a protected attribute to store the book's title. Then, you will add a helper variable, write a method to access the protected attribute, and finally print the book title.
📋 What You'll Learn
Create a class called Book with a protected attribute _title
Add a variable book that creates an instance of Book with the title 'Python Basics'
Write a method get_title inside the Book class to return the protected _title
Print the book title by calling the get_title method on the book instance
💡 Why This Matters
🌍 Real World
Protected attributes help keep important data safe inside objects, like protecting a book's title from accidental changes.
💼 Career
Understanding protected attributes is useful for writing clean, safe code in software development jobs, especially when working with classes and objects.
Progress0 / 4 steps
1
Create the Book class with a protected attribute
Create a class called Book with an __init__ method that takes a parameter title and assigns it to a protected attribute called _title.
Python
Hint
Use self._title = title inside the __init__ method to create the protected attribute.
2
Create an instance of the Book class
Create a variable called book and set it to an instance of the Book class with the title 'Python Basics'.
Python
Hint
Use book = Book('Python Basics') to create the instance.
3
Add a method to access the protected attribute
Inside the Book class, add a method called get_title that returns the protected attribute _title.
Python
Hint
Define get_title with def get_title(self): and return self._title.
4
Print the book title using the method
Write a print statement to display the book title by calling the get_title method on the book instance.
Python
Hint
Use print(book.get_title()) to show the title.
Practice
(1/5)
1. What does a single underscore prefix (e.g., _value) in a Python class attribute indicate?
easy
A. It is a public attribute accessible everywhere.
B. It is a protected attribute meant for internal use within the class and subclasses.
C. It is a private attribute that cannot be accessed outside the class.
D. It is a special Python keyword for constants.
Solution
Step 1: Understand underscore usage in Python
A single underscore prefix means the attribute is intended for internal use, signaling protection but not strict privacy.
Step 2: Differentiate from private and public
Private attributes use double underscores, public have no underscore, and constants are uppercase without underscores.
Final Answer:
It is a protected attribute meant for internal use within the class and subclasses. -> Option B
Quick Check:
Single underscore = protected attribute [OK]
Hint: Single underscore means 'protected' by convention [OK]
Common Mistakes:
Confusing single underscore with private (double underscore)
Thinking single underscore makes attribute inaccessible
Assuming single underscore means public attribute
2. Which of the following is the correct way to define a protected attribute named _count inside a Python class?
easy
A. self._count = 0
B. count = 0
C. self.__count = 0
D. self.count = 0
Solution
Step 1: Identify protected attribute syntax
Protected attributes start with a single underscore, so self._count is correct.
Step 2: Check other options
self.count is public, self.__count is private, and count = 0 is a local variable, not an attribute.
Final Answer:
self._count = 0 -> Option A
Quick Check:
Protected attribute = single underscore prefix [OK]
Hint: Use single underscore for protected attributes inside classes [OK]
Common Mistakes:
Using no underscore for protected attribute
Using double underscore for protected instead of private
Protected attributes can be accessed outside the class, though it is discouraged.
Step 2: Check code behavior
The attribute _value is set to 10 and printed directly, so output is 10.
Final Answer:
10 -> Option C
Quick Check:
Protected attribute accessible outside class = 10 [OK]
Hint: Protected attributes can be read outside class [OK]
Common Mistakes:
Expecting AttributeError when accessing protected attribute
Confusing protected with private attributes
Thinking protected attributes are hidden
4. Find the error in this code that tries to access a protected attribute:
class Parent:
def __init__(self):
self._data = 5
class Child(Parent):
def print_data(self):
print(self.data)
c = Child()
c.print_data()
medium
A. TypeError because of wrong method call
B. SyntaxError due to missing colon
C. No error, prints 5
D. AttributeError because self.data does not exist
Solution
Step 1: Check attribute names in Parent and Child
Parent defines self._data, but Child tries to print self.data, which does not exist.
Step 2: Understand error type
Accessing a non-existent attribute causes AttributeError at runtime.
Final Answer:
AttributeError because self.data does not exist -> Option D
Quick Check:
Wrong attribute name = AttributeError [OK]
Hint: Check exact attribute names when accessing [OK]
Common Mistakes:
Ignoring underscore in attribute name
Assuming protected attribute is private and inaccessible
Confusing syntax errors with attribute errors
5. You want to create a class BankAccount with a protected attribute _balance that can be safely accessed and updated only by subclasses. Which code snippet correctly implements this?
hard
A. class BankAccount:
def __init__(self, balance):
self._balance = balance
class SavingsAccount(BankAccount):
def deposit(self, amount):
self._balance += amount
acc = SavingsAccount(100)
acc.deposit(50)
print(acc._balance)
B. class BankAccount:
def __init__(self, balance):
self.__balance = balance
class SavingsAccount(BankAccount):
def deposit(self, amount):
self.__balance += amount
acc = SavingsAccount(100)
acc.deposit(50)
print(acc.__balance)
C. class BankAccount:
def __init__(self, balance):
self.balance = balance
class SavingsAccount(BankAccount):
def deposit(self, amount):
self.balance += amount
acc = SavingsAccount(100)
acc.deposit(50)
print(acc.balance)
D. class BankAccount:
def __init__(self, balance):
_balance = balance
class SavingsAccount(BankAccount):
def deposit(self, amount):
_balance += amount
acc = SavingsAccount(100)
acc.deposit(50)
print(_balance)
Solution
Step 1: Identify protected attribute usage
class BankAccount:
def __init__(self, balance):
self._balance = balance
class SavingsAccount(BankAccount):
def deposit(self, amount):
self._balance += amount
acc = SavingsAccount(100)
acc.deposit(50)
print(acc._balance) uses self._balance which is protected and accessible in subclass.