Python không có access modifier thật (private/protected). Thay vào đó là quy ước và một cơ chế đổi tên:
_name(1 gạch đầu): quy ước "nội bộ, đừng đụng từ ngoài" — thuần convention, không ràng buộc, vẫn truy cập được.__name(2 gạch đầu, tối đa 1 gạch cuối): trình biên dịch đổi tên thành_ClassName__name— gọi là name mangling. Mục đích không phải giấu mà tránh trùng tên khi subclass vô tình đặt cùng attribute.__dunder__(2 gạch đầu và đuôi): tên đặc biệt của Python (__init__,__len__), không bị mangle.
python
class A:
def __init__(self):
self.__x = 1 # thực chất là self._A__x