Python Access Modifiers
Access Modifiers in Python
In Python, access modifiers are implemented using naming conventions:
public_attr: Public attribute_protected_attr: Protected attribute (convention: underscore prefix)__private_attr: Private attribute with name mangling (double underscore prefix)
class MyClass:
def __init__(self):
self.public_attr = "Public attribute" # Public attribute
self._protected_attr = "Protected attribute" # Protected attribute
self.__private_attr = "Private attribute" # Private attribute with name mangling
# Creating an instance of MyClass
obj = MyClass()
# Accessing attributes directly
print(obj.public_attr) # Output: Public attribute
print(obj._protected_attr) # Output: Protected attribute
print(obj._MyClass__private_attr) # Output: Private attribute
Name Mangling
Name mangling in Python makes attributes private by adding a prefix _ClassName:
class MyClass:
def __init__(self):
self.__private_attr = "Private attribute"
# Creating an instance of MyClass
obj = MyClass()
# Accessing private attribute using name mangling
print(obj._MyClass__private_attr) # Output: Private attribute
Python Property Object
Python's property() function allows defining properties with getter, setter, and deleter methods:
class Celsius:
def __init__(self, temperature=0):
self._temperature = temperature
def get_temperature(self):
print("Getting value...")
return self._temperature
def set_temperature(self, value):
print("Setting value...")
if value < -273.15:
raise ValueError("Temperature below -273.15°C is not possible.")
self._temperature = value
temperature = property(get_temperature, set_temperature)
# Using the Celsius class with property
c = Celsius()
# Accessing temperature property
print(c.temperature) # Output: Getting value... 0
# Setting temperature property
c.temperature = 37 # Output: Setting value...
Getters and Setters
Python uses decorators like @property, @attribute.setter, and @attribute.deleter to define getters, setters, and deleters:
class Employee:
def __init__(self, first_name, last_name):
self._first_name = first_name
self._last_name = last_name
@property
def full_name(self):
return f"{self._first_name} {self._last_name}"
@full_name.setter
def full_name(self, name):
first_name, last_name = name.split(' ')
self._first_name = first_name
self._last_name = last_name
@full_name.deleter
def full_name(self):
del self._first_name
del self._last_name
# Using getters and setters
emp = Employee("John", "Doe")
# Getting full name
print(emp.full_name) # Output: John Doe
# Setting full name
emp.full_name = "Jane Smith"
print(emp.full_name) # Output: Jane Smith