Начинаются с одного или двух символов подчеркивания (_
или __
). Python не делает их по-настоящему private, но это соглашение указывает, что их не следует вызывать напрямую извне класса. Например: def _internal_method(self): ...
Это обычные методы класса, не начинающиеся с символа подчеркивания. Они предназначены для использования вне класса и составляют public API. Например: def public_method(self): ...
class MyClass:
def _internal_method(self):
print("Это внутренний метод")
def public_method(self):
print("Это внешний метод")
self._internal_method()
obj = MyClass()
obj.public_method() # Допустимо
# obj._internal_method() # Не рекомендуется, хотя и возможно
В Python различие между "внутренними" и "внешними" методами обеспечивается конвенциями об именовании и применением модификаторов доступа (хотя Python не имеет строгих приватных методов, как, например, в Java или C++).
Внешние методы (public): Это методы, которые предназначены для использования извне класса. Их можно вызывать через экземпляр класса. Имена таких методов обычно не начинаются с символа подчеркивания.
Внутренние методы (protected/private):
_method_name
). Это конвенция, указывающая, что метод предназначен для использования внутри самого класса и его подклассов. Несмотря на это, их можно вызвать извне, но это считается дурным тоном и может нарушить структуру класса.__method_name
). Python использует name mangling для таких методов. Это означает, что имя метода изменяется, добавляя к нему имя класса с символом подчеркивания в начале (например, для класса MyClass
метод __method_name
будет преобразован в _MyClass__method_name
). Это затрудняет вызов метода извне напрямую, но не делает это невозможным. Приватные методы предназначены для использования только внутри самого класса.Пример:
class MyClass:
def public_method(self):
"""Этот метод предназначен для использования извне класса."""
print("Public method called")
self._protected_method()
self.__private_method()
def _protected_method(self):
"""Этот метод предназначен для использования внутри класса и его подклассов."""
print("Protected method called")
def __private_method(self):
"""Этот метод предназначен только для использования внутри класса."""
print("Private method called")
# Использование
my_object = MyClass()
my_object.public_method() # Корректно
# Обратите внимание, что следующее не рекомендуется и может нарушить инкапсуляцию
# my_object._protected_method() # Работать будет, но не рекомендуется
# my_object._MyClass__private_method() # Работать будет, но крайне не рекомендуется
Важно: В Python нет строгой приватности или защиты. Все основано на конвенциях. Программист должен следовать этим конвенциям, чтобы обеспечить правильное использование и поддержку кода.