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 Name Mangling in Python
📖 Scenario: Imagine you are creating a simple class to store information about a secret agent. You want to keep the agent's real identity hidden inside the class so it cannot be accessed directly from outside.
🎯 Goal: You will create a class with a private attribute using name mangling, then access it safely through a method.
📋 What You'll Learn
Create a class called Agent with a private attribute
Use name mangling by prefixing the attribute name with double underscores
Add a method to return the private attribute value
Create an instance of the class and print the secret identity using the method
💡 Why This Matters
🌍 Real World
Name mangling helps protect sensitive data inside classes, like passwords or secret information, so it is not easily accessed or changed from outside.
💼 Career
Understanding name mangling is important for writing secure and well-encapsulated Python code, a key skill for software developers and engineers.
Progress0 / 4 steps
1
Create the Agent class with a private attribute
Create a class called Agent with a private attribute named __real_name set to the string 'James Bond' inside the __init__ method.
Python
Hint
Use self.__real_name = 'James Bond' inside the __init__ method to create the private attribute.
2
Add a method to access the private attribute
Inside the Agent class, add a method called get_real_name that returns the value of the private attribute __real_name.
Python
Hint
Define a method get_real_name that returns self.__real_name.
3
Create an instance of Agent
Create a variable called agent and assign it to a new instance of the Agent class.
Python
Hint
Create an instance by writing agent = Agent().
4
Print the secret identity using the method
Use print to display the secret identity by calling the get_real_name method on the agent object.
Python
Hint
Call agent.get_real_name() inside print() to show the secret name.
Practice
(1/5)
1. What does name mangling do to an attribute starting with double underscores in a Python class?
easy
A. It adds the class name before the attribute name to avoid conflicts.
B. It makes the attribute public and accessible everywhere.
C. It deletes the attribute from the class.
D. It converts the attribute name to uppercase.
Solution
Step 1: Understand double underscore prefix
Attributes starting with double underscores trigger name mangling in Python classes.
Step 2: Effect of name mangling
Python adds the class name before the attribute name to avoid accidental access or conflicts.
Final Answer:
It adds the class name before the attribute name to avoid conflicts. -> Option A
Quick Check:
Name mangling = adds class name prefix [OK]
Hint: Double underscores add class name prefix to attribute [OK]
Common Mistakes:
Thinking double underscores make attribute public
Confusing name mangling with deleting attributes
Assuming attribute name changes to uppercase
2. Which of the following is the correct way to define a private attribute using name mangling in a Python class?
easy
A. self.__my_attr = 5
B. def __my_attr(self): pass
C. self._my_attr = 5
D. self.my_attr__ = 5
Solution
Step 1: Identify private attribute syntax
Private attributes use double underscores at the start of the name, like __my_attr.
Step 2: Check correct assignment
Assigning with self.__my_attr = 5 correctly defines a private attribute with name mangling.
Final Answer:
self.__my_attr = 5 -> Option A
Quick Check:
Double underscore prefix = private attribute [OK]
Hint: Use double underscores before attribute name for private [OK]
Common Mistakes:
Using single underscore instead of double
Placing underscores after attribute name
Defining private attribute as a method incorrectly
3. What will be the output of this code?
class A:
def __init__(self):
self.__x = 10
a = A()
print(hasattr(a, '__x'))
print(hasattr(a, '_A__x'))
medium
A. True\nTrue
B. False\nTrue
C. True\nFalse
D. False\nFalse
Solution
Step 1: Check attribute __x existence
Due to name mangling, __x is stored as _A__x internally, so hasattr(a, '__x') returns False.
Step 2: Check mangled attribute _A__x existence
hasattr(a, '_A__x') returns True because this is the mangled name storing the value.
Final Answer:
False
True -> Option B
Quick Check:
__x hidden as _A__x = False, True [OK]
Hint: Check mangled name with _ClassName__attr [OK]
Common Mistakes:
Assuming __x is directly accessible
Confusing mangled name with original
Expecting both hasattr calls to be True
4. What is the error in this code snippet?
class B:
def __init__(self):
self.__val = 5
b = B()
print(b.__val)
medium
A. SyntaxError due to double underscores
B. No error, prints 5
C. TypeError because __val is private
D. AttributeError because __val is name mangled
Solution
Step 1: Understand name mangling effect
__val is mangled to _B__val internally, so b.__val does not exist.
Step 2: Accessing __val causes AttributeError
Trying to print b.__val raises AttributeError because the attribute is hidden by name mangling.
Final Answer:
AttributeError because __val is name mangled -> Option D
Quick Check:
Accessing __val directly = AttributeError [OK]
Hint: Access mangled attribute with _ClassName__attr [OK]
Common Mistakes:
Expecting no error when accessing __val
Thinking double underscores cause syntax error
Confusing AttributeError with TypeError
5. Given this class:
class C:
def __init__(self):
self.__data = 42
def get_data(self):
return self.__data
c = C()
How can you access the private attribute __data from outside the class without using the get_data method?
hard
A. c.__data
B. c._data
C. c._C__data
D. c.get_data()
Solution
Step 1: Understand name mangling for __data
The attribute __data is stored internally as _C__data due to name mangling.
Step 2: Access mangled attribute directly
You can access it from outside the class using c._C__data.
Final Answer:
c._C__data -> Option C
Quick Check:
Access private with _ClassName__attr [OK]
Hint: Use _ClassName__attr to access private attribute [OK]