encapsulation in python
Python hosting: Host, run, and code Python in the cloud!
Encapsulation is a fundamental concept in object-oriented programming (OOP). In a nutshell, encapsulation in Python allows us to restrict the access to certain methods and variables within the class, ensuring that the data is hidden and safe from any unintentional modifications. Dive into this guide to understand encapsulation in Python with examples.
Boost Your Python Skills: Python Programming Bootcamp: Go from zero to hero.
Understanding Private Methods in Python
Consider the following scenario: We have a Car
class, which consists of two main methods: drive()
and the private method __updateSoftware()
. When we instantiate the Car
class, the __updateSoftware()
method gets executed.
However, here’s the catch. You cannot invoke the private method (__updateSoftware()
) directly using the object outside the class. Here’s how it’s done:
1 | class Car: |
Executing the above program would give you:1
2updating software
driving
The crux here is that encapsulation ensures accidental data access restrictions. Still, determined users can intentionally access it. Though the private methods appear hidden, they are simply renamed with the class name prefixed, like _Car__updateSoftware()
. Therefore, you can still access the method using redcar._Car__updateSoftware()
.
Leveraging Private Variables in Python
Just like methods, variables can be set as private. The beauty of private variables lies in their restricted access, ensuring they are modified only within the class methods, not outside. This is crucial for protecting vital application data.
Here’s an illustration:
1 | class Car: |
Now, what if you wish to modify a private variable? Use a setter method—a dedicated method designed to set or alter the value of private variables:
1 | class Car: |
Setter methods are handy. While some private variables might need occasional updates, others might not necessitate any changes.
Encapsulation in Python: A Summary
In Python, encapsulation can be primarily categorized as:
- Public Methods: These are accessible universally.
- Private Methods: Exclusive to their class, these begin with two underscores.
- Public Variables: These are universally accessible.
- Private Variables: Restricted to their class or through specific methods (if provided), these also commence with two underscores.
Unlike some other programming languages, Python doesn’t support protected class methods. By encapsulating data, you get superior control over how much coupling exists in your code. Essentially, it permits a class to evolve its implementation without impacting other code segments.
Leave a Reply:
"If you want to change the value of a private value, an setter method is used. This is simply a method that sets the value of a private value."
there is a typo --> change the value of a private value --> change the value of a private variable
Thanks Tomislav! I updated it
so __ before a method or variable is considered as a private members is it...?
Yes, if you put __ before a method or variable it is a private member. This means you can only access it using a method.
It's weird that for python the default access for a variable is public...
Hi! It's cultural, in both Python and Java nothing prevents you from declaring all variables public, encapsulation is not strictly enforced in either language. In Java variables are private by default, in Python private variables are not enforced. In practice there is not a lot of difference because the developer has the authority on the code.
And in C++ a struct is a class where all the members are public by default.
Does Python support namespaces?
Hi Terry,
Yes there are namespaces, but there are a variety of ways to implement them.
I would recommend the third method because it's the most clean solution.
Method 1: Use dictionary
Everything is an object in Python, a dictionary can act as a namespace.
Method 2: Use packages
Create a directory /example/demo/ for your package. Inside it create a file called __init__.py with this contents:
Method 3: Use pkgutil
If you use pkgutil, you can create nested packages. Create a directory using this structure
<ul>
<li>/example/hello/</li>
<li>/example/hello/__init__.py</li>
<li>/example/hello/english/</li>
<li>/example/hello/english/__init__.py</li>
<li>/example/hello/dutch/</li>
<li>/example/hello/dutch/__init__.py</li>
<li>/example/test.py</li>
</ul>
In /example/hello/__init__.py put:
In /example/hello/english/__init__.py put:
In /example/hello/dutch/__init__.py put:
Your package is now complete. You can use nested namespaces.
Add this to /example/test.py and execute it:
first of all __maxspeed is private but i'm still able to access it with object name & another thing when i used print(redcar.__maxspeed) it prints updated value 10 could you please explain the behaviour
class Person:
__name #variable
class Programmer(Person)
self_Person__name ------> meaning full explanation please for this
Hi Amit,
The class Programmer inherits from the class Person. The Person class has a variable called name. Because Programmer inherits from Person, it has access to the name variable. For more on inheritance, read here.
Hi,Frank
What's the text font in the source code?
Hi Jacky, I think it's monospace
Hi Frank,
i am getting problem in file handling. i have written program which count number of lines and total words in file but it is not giving me correctly the number of words. my txt file is :
this program is giving me 58 words while there are not 58 words. Secondly when i write filename.read instead of filename.readlines then it does not give me correct number of lines. why?
If you print word inside the for word loop, it will show it splits the line into single characters. To split into words use this:
read() and readlines() are different methods. read() takes x characters from a file. readlines() reads the whole file and splits by newlines.
Many thanks :)
"The private method __updateSoftware() can only be called within the class itself. It can never be called from outside the class."
Why don't you tell that the method can actually be called using redcar._Car__updateSoftware() ?
The "private" attributes and methods are not really hidden, they're just automatically renamed adding "_Car" in the beginning of their name... This truly prevents from accessing them *accidentally* but not intentionally...
Thanks! I updated the post.