Access Modifiers

What are Access Modifiers?

In simple English,
Access Modifiers help you control:

β€œWho can access which part of the class?”


πŸ”“ Public (default)

  • Anyone can access it from anywhere

  • No special symbol needed

class BankAccount:
    def __init__(self, balance):
        self.balance = balance  # public

    def show_balance(self):
        print(f"Balance is {self.balance}")

acc = BankAccount(500)
acc.show_balance()         # βœ… works
print(acc.balance)         # βœ… also works

πŸ” Private β†’ __ (double underscore)

  • Only accessible inside the class

  • Outside access gives error

class BankAccount:
    def __init__(self, balance):
        self.__balance = balance  # private

    def show_balance(self):
        print(f"Balance is {self.__balance}")

acc = BankAccount(500)
acc.show_balance()         # βœ… works
print(acc.__balance)       # ❌ error

But yes, you can still access it with a trick (not recommended):

print(acc._BankAccount__balance)  # βœ… works (name mangling)

πŸ›‘ Protected β†’ _ (single underscore)

  • It means: β€œthis is not for public use”

  • Still accessible, but considered internal

  • Useful for child classes

class BankAccount:
    def __init__(self, balance):
        self._balance = balance  # protected

class SavingsAccount(BankAccount):
    def show(self):
        print(f"Balance: {self._balance}")

acc = SavingsAccount(1000)
acc.show()               # βœ… works
print(acc._balance)      # βœ… works but not best practice

πŸ” Example with all 3

class BankAccount:
    def __init__(self, name, balance):
        self.name = name              # public
        self._account_type = "Saving" # protected
        self.__balance = balance      # private

    def get_balance(self):            # public method
        return self.__balance

    def __update_balance(self, amount):  # private method
        self.__balance += amount

πŸ“ Summary

Modifier

Symbol

Meaning

Public

self.name

Accessible from everywhere

Protected

self._name

Access within class & child

Private

self.__name

Only inside the class

Updated on