_ClassName__method_name, но напрямую его вызов извне класса становится затруднительным и не рекомендуется.  Это более строгий вариант, но не абсолютно непреодолимый.Существует несколько способов ограничить доступ к методу в Python, чтобы его нельзя было вызвать извне класса:
_):
            Это соглашение, говорящее о том, что метод предназначен для внутреннего использования в классе или модуле. Однако, Python не предотвращает его прямой вызов извне. Это скорее рекомендация для программистов. Например:
class MyClass:
    def _internal_method(self):
        print("Это внутренний метод")
    def public_method(self):
        self._internal_method() # Вызов внутреннего метода внутри класса
obj = MyClass()
obj.public_method() # Работает
obj._internal_method() # Работает, но не рекомендуетсяВажно: Это не делает метод приватным! Он все еще доступен извне.
__):
            Это механизм name mangling (искажения имени). Python переименовывает метод, добавляя к нему имя класса с префиксом "_". Это затрудняет (но не делает невозможным) вызов метода извне. Например:
class MyClass:
    def __private_method(self):
        print("Это приватный метод")
    def public_method(self):
        self.__private_method() # Вызов приватного метода внутри класса
obj = MyClass()
obj.public_method() # Работает
# obj.__private_method() # Вызовет AttributeError: 'MyClass' object has no attribute '__private_method'
obj._MyClass__private_method() # Работает, но это взлом
В данном примере __private_method будет доступен как _MyClass__private_method.  Хотя это затрудняет вызов, это не абсолютная защита.
Если вам нужно контролировать доступ к атрибуту, а не к методу, вы можете использовать свойства. Это позволит вам определять методы getter и setter, которые будут вызываться при попытке чтения или записи атрибута. Это не совсем ограничение доступа к методу, но позволяет контролировать логику доступа к данным, что может быть полезно. Пример:
class MyClass:
    def __init__(self):
        self._my_attribute = None
    @property
    def my_attribute(self):
        return self._my_attribute
    @my_attribute.setter
    def my_attribute(self, value):
        # Дополнительная логика валидации или обработки
        if isinstance(value, int):
            self._my_attribute = value
        else:
            raise ValueError("Атрибут должен быть целым числом")
obj = MyClass()
obj.my_attribute = 10 #Работает
# obj.my_attribute = "abc" # Вызовет ValueError
print(obj.my_attribute)
В этом примере, нельзя присвоить атрибуту my_attribute нецелочисленное значение.
Итог: В Python нет концепции "настоящих" приватных методов в смысле, как это реализовано, например, в Java или C++. Двойное подчеркивание – это наиболее распространенный и рекомендуемый способ, чтобы указать, что метод предназначен для внутреннего использования, и не должен вызываться напрямую извне класса. Все остальное – это соглашения и способы контролировать логику доступа, а не абсолютные запреты.