こんなモジュールを用意

# y.py
a = 1
_b = 2
__c = 3

class Y:
a = 10
_b = 20
__c = 30

>>> import y
>>> y.a
1
>>> y._b
2
>>> y.__c
3

このあたりは普通にアクセスできる

>>> yi = y.Y()
>>> yi.a
10
>>> yi._b
20
>>> yi.__c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Y' object has no attribute '__c'

クラスのプロパティにすると __ から始まるのは見えない

プロパティ一覧をみると

>>> dir(yi)
['_Y__c', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_b', 'a']
>>> yi._Y__c
30

_Y__c というそれらしい名前があるのでアクセスすると __c のデータにアクセスできた
__ から始めるとそのままアクセスできないように名前が変更されるみたい

名前変わるだけでアクセス権という概念はないから名前わかればアクセスできる