Encapsulation and Method Types
Now you'll master professional-grade class design through access control and multiple method types. In this lesson, you'll discover why encapsulation matters through experimentation, learn from AI how to protect attributes and design methods, challenge AI with real-world design decisions, and build a comprehensive guide for method selection.
Part 1: Experience Access Control and Method Types
Your Role: Code explorer discovering why data protection and method organization matter
Discovery Exercise: The Unprotected Account Problem
Create method_discovery.py:
Loading Python environment...
Your task 1: Identify the problems:
- What prevents setting invalid balances?
- If I have 100 methods using
self.balance, and I need to add a fee calculation, where do I modify code?
Discovering the Solution: Method Types
Stage 2: Using Instance Methods
Loading Python environment...
Your task 2: Run this and observe:
- How does using methods instead of direct attribute access help?
- What happens if someone ignores the _ convention?
Stage 3: Discovering Private Attributes
Loading Python environment...
Your task 3: Run this and answer:
- Can you access __balance directly?
- Is this truly "private" or just annoying?
Discovery Exercise 2: Multiple Method Types

Stage 4: Instance Methods vs Class Methods vs Static Methods
Loading Python environment...
Your task 4: Run this and observe:
- Which methods need an object to work?
- Which can work with just the class?
- Which are just utility functions grouped with the class?
Your Discoveries
Document in method_type_analysis.md:
- Why do instance methods use
self? - When would you use a class method instead?
- When would a static method be useful?
- Why protect attributes with methods instead of direct access?
Part 2: Learn Access Control and Method Design
Your Role: Student receiving instruction from AI Teacher
AI Teaching Prompt
Ask your AI companion:
"I've discovered three method types and different access control levels. Show me and explain:
- What's the difference between @classmethod and @staticmethod?
- When should I use each?
- For a BankAccount class, which method type would you use for:
- deposit() which changes THIS account's balance
- get_interest_rate() which all accounts share
- is_valid_account_number() which just validates a string
- Show me how to enforce that balance can't be negative using a property."
Convergence Activity
After AI explains, ask: "Show me how the @property decorator works for protecting an attribute while allowing read access. Why is this better than a get_balance() method?"
Deliverable: Write summary explaining when to use each method type.
Part 3: Challenge AI with Method Design
Your Role: Student teaching AI by testing design understanding
Challenge 1: Factory Pattern
"Show me a Dog class where you have a class method that creates a Dog from a string like 'Max_Labrador_5'. Why is this better than having users call init directly?"
Challenge 2: Properties vs Methods
"In a class with a
_balanceattribute, would you expose it as:
- A method: account.get_balance()
- A property: account.balance (looks like attribute but uses @property)
Which feels more Pythonic? Why?"
Challenge 3: Static Methods in Practice
"When would a static method be useful? Show me a real example where a static method makes sense vs a module-level function."
Deliverable
Document challenges and AI responses with your analysis.
Part 4: Build Your Method Design Guide
Your Role: Knowledge synthesizer creating design framework
Create method_types_and_encapsulation_guide.md:
Template structure:
Method Types and Encapsulation Guide
Instance Methods - Use when: Method operates on specific object's data
Loading Python environment...
Class Methods (@classmethod) - Use when: Method operates on class data or creates instances
Loading Python environment...
Static Methods (@staticmethod) - Use when: Utility function grouped with class but doesn't need instance or class
Loading Python environment...
Access Levels:
- Public:
self.name- Direct access encouraged - Protected:
self._balance- Convention, don't access directly - Private:
self.__ssn- Name mangled, discourage access
Properties (@property/@setter) - Make attributes look like data while using method validation
Loading Python environment...
Deliverable: Complete guide with method type selection criteria.
Try With AI
Ready to understand encapsulation, master method types, and control attribute access with properties?
🔍 Explore Public vs Protected vs Private:
"Build a BankAccount class with three attributes: account_number (public), _balance (protected, convention), __pin (private, name-mangled). Show me how to access each from outside the class. Explain why balance should be protected and what Python's name mangling does with __pin."
🎯 Practice Instance vs Class vs Static Methods:
"Create a MathHelper class. Add three methods: 1) instance method square_value(self, x) using instance state, 2) class method create_with_preset(cls, preset_name) returning new object, 3) static method is_prime(n) with no self or cls. Explain when to use each type."
🧪 Test Properties for Validation:
"Build a Person class with age property. Use @property for getter, @age.setter for setter that validates (0 to 150 range). Try: person.age = -5, person.age = 200, person.age = 25. Show how properties enable validation without breaking the attribute access API. Why is this better than get_age()/set_age()?"
🚀 Apply to Data Validation:
"I'm building a Product class. Price must be positive, stock can't be negative, discount must be 0-100%. Design the class with properties that validate on every set. Show validation error messages. How do properties make the API cleaner than validate_and_set_price() methods?"