В чем разница между _internal, __noOverideи __system__ в Python?

Это то, как Python выполняет «сильную» инкапсуляцию, как C++ и Java? Являются ли они общедоступными, частными и защищенными модификаторами доступа для python?

Ответ: «Нет», это не так. Несмотря на то, что Python является объектно-ориентированной программой (ООП), он не является чистым ООП. Он не поддерживает сильную инкапсуляцию. Это означает, что в Python нет ничего действительно частного или защищенного. Класс не может помешать вам получить доступ к тому, что находится внутри него. Питон доверяет вам. Это напоминает мне известную цитату автора языка программирования Python «здесь мы все взрослые люди по обоюдному согласию». Итак, для чего используются вышеупомянутые обозначения?

_internal (одиночное подчеркивание перед именем): это просто означает, что это внутренняя деталь реализации. Если вы не знаете, что это такое, не трогайте это. На самом деле это никому не мешает использовать это. Это следует рассматривать как детали реализации метода, данных или члена, которые могут быть изменены без предварительного уведомления.

Для интерпретатора это действительно что-то значит. При импорте модуля ни одно из имен, начинающихся с (_internal), не будет импортировано, если они явно не содержатся в списке __all__ модуля.

__noOveride (двойное подчеркивание перед именем): во-первых, это не работает так, как Java или C++. Программисты, пришедшие с других языков, часто злоупотребляют этим. Это «не» для того, чтобы сделать метод приватным. Идея состоит в том, чтобы предотвратить конфликт и избежать переопределения метода подклассом или дочерним классом. Одиночное подчеркивание означает, что вы не хотите, чтобы подклассы переопределяли этот метод, он будет доступен из класса.

алфавит класса(объект):
def __method(сам):
print «Я в алфавите»

метод определения(self):
self.__method()

класс google(алфавит):
def __method(self):
print «Я в google»

› a = Alphabet()
› a.method()
› Я в алфавите

› b = google()
› b.method()
› Я в алфавите

Python внутренне заменяет (__noOverride) на (_classname__noOverride). Это делается для того, чтобы избежать конфликтов имен с именами, определенными подклассами.

__system__ (двойное подчеркивание до и после имени): двойное подчеркивание до и после метода просто означает, что этот метод не вызывается. Это метод, используемый Python System. __init__() используется при создании объекта класса и используется для инициализации объекта. __new__() используется для создания экземпляра. __str__() используется для преобразования в строку. Это способ, которым система python предотвращает конфликты своих имен с именами, определенными пользователем.

рынок класса(объект):
def __init__(self, stock_name,ticker , цена):
self.stock_name = stock_name
self .ticker = тикер
self.price = цена