Encapsulation, in the realm of object-oriented programming, encompasses the practice of consolidating data and methods into a cohesive entity known as a class.
This principle serves to obscure the inner workings of an object, while offering an avenue to engage with and manipulate the object via its public interface.
In Python, encapsulation can be achieved using access modifiers. There are three access modifiers available in Python:
- Public: Public members are accessible from anywhere, both inside and outside the class. By default, all members in a class are public.
- Protected: Protected members are denoted by a single underscore (_) prefix. They can be accessed within the class and its subclasses. However, they are conventionally considered private and should not be accessed from outside the class or its subclasses.
- Private: Private members are denoted by a double underscore (__) prefix. They cannot be accessed directly from outside the class. Python internally modifies the name of private members to avoid name clashes between different classes. Private members can only be accessed indirectly within the class.
Here’s an example that demonstrates encapsulation in Python:
class Car:
def __init__(self):
self.__max_speed = 200 # Private member
self._current_speed = 0 # Protected member
def accelerate(self, speed):
self._current_speed += speed
if self._current_speed > self.__max_speed:
self._current_speed = self.__max_speed
def get_speed(self):
return self._current_speed
# Creating an instance of the Car class
my_car = Car()
# Accessing public method to accelerate the car
my_car.accelerate(50)
# Accessing public method to get the current speed
print(my_car.get_speed()) # Output: 50
# Trying to access private member directly
print(my_car.__max_speed) # Raises AttributeError: 'Car' object has no attribute '__max_speed'
# Trying to access protected member directly
print(my_car._current_speed) # Output: 50
Code language: Python (python)
In the example above, the Car
class has a private member __max_speed
and a protected member _current_speed
.
The accelerate
method allows increasing the current speed while checking if it exceeds the maximum speed. The get_speed
method provides a way to retrieve the current speed.
Attempting to access the private member __max_speed
directly outside the class raises an AttributeError
.
However, the protected member _current_speed
can be accessed outside the class, although it’s conventionally considered private and not intended for direct access.
What are 2 examples of encapsulation?
Here are two examples of encapsulation in Python:
Bank Account:
class BankAccount:
def __init__(self, account_number, balance):
self.__account_number = account_number # Private member
self.__balance = balance # Private member
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
else:
print("Insufficient funds")
def get_balance(self):
return self.__balance
# Creating an instance of the BankAccount class
account = BankAccount("123456789", 1000)
# Accessing public methods to deposit and withdraw
account.deposit(500)
account.withdraw(200)
# Accessing public method to get the balance
print(account.get_balance()) # Output: 1300
# Trying to access private members directly
print(account.__account_number) # Raises AttributeError: 'BankAccount' object has no attribute '__account_number'
print(account.__balance) # Raises AttributeError: 'BankAccount' object has no attribute '__balance'
Code language: Python (python)
In this example, the BankAccount
class encapsulates the account number and balance as private members.
The public methods deposit
, withdraw
, and get_balance
provide a way to interact with the object while maintaining encapsulation.
The private members cannot be accessed directly from outside the class.
Employee:
class Employee:
def __init__(self, name, salary):
self._name = name # Protected member
self._salary = salary # Protected member
def get_details(self):
return f"Name: {self._name}, Salary: {self._salary}"
# Creating instances of the Employee class
employee1 = Employee("John Doe", 5000)
employee2 = Employee("Jane Smith", 6000)
# Accessing protected members indirectly through public method
print(employee1.get_details()) # Output: Name: John Doe, Salary: 5000
print(employee2.get_details()) # Output: Name: Jane Smith, Salary: 6000
# Trying to access protected members directly
print(employee1._name) # Output: John Doe
print(employee2._salary) # Output: 6000
Code language: Python (python)
In this example, the Employee
class encapsulates the employee’s name and salary as protected members.
The get_details
method allows accessing the details of an employee.
The protected members can be accessed indirectly through the public method or even directly from outside the class, although it’s conventionally considered private and not intended for direct access.
Please note that in Python, there is no strict enforcement of encapsulation like in some other programming languages.
The use of naming conventions with single and double underscores is a convention followed by programmers to indicate the intended access level of members.
Read More;
- Simple Python Script Example [Super Simple!]
- What is The Example of Polymorphism in Python?
- Example for User-defined Exception in Python
- What are Membership Operators in Python With Example?
- Example Readme File For Python Project
- Python Joblib Parallel For Loop Example
- How to Derive in Python
- What is ‘Self’ in Python With Example
- What is Keyword Argument in Python with Example?
- What is Inheritance With Examples in Python
- What is Token in Python With Example
- What is method overloading in Python with example?