SimpleTuts.com

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