Является ли init () закрытым методом в Python?

Начало работы с отладчиками Python Программирование и разработка

Здесь, в этой статье, мы собираемся выяснить, действительно ли __init__() в Python является приватным или нет. Таким образом, мы можем столкнуться со многими вопросами, такими как:

  • Что на самом деле представляет собой метод __init__()?
  • Что такое приватные методы?
  • И если __init__() является закрытым, то как мы можем получить к нему доступ вне класса?

Мы уже слышали о концепции, согласно которой закрытые методы не могут быть доступны вне класса, в котором они объявлены, а также не могут быть доступны из их базового класса, но если это так, то как мы можем оправдать то, что мы вызываем метод __init__() каждый раз, когда мы создать объект класса, который также находится вне класса, и с помощью ключевого слова super или с использованием имени класса мы также можем вызвать метод __init__() родительского класса.

Accessing __init__() в Python

Нам нужен конструктор для инициализации элементов данных класса при создании экземпляра класса. Подобно методам, конструктор также содержит набор операторов, которые выполняются сразу после создания объекта. Init всегда вызывается всякий раз, когда мы инициируем класс.

Python3

# initialising class
class Demo:
   
    # defining a constructor
    def __init__(self, name):
 
        self.name = name
        print("Initalised value is", self.name)
 
 
# Driver code
obj1 = Demo("GFG")
obj2 = Demo("Geeks")
obj3 = Demo("GeeksForGeeks")

Выход:

Initalised value is GFG
Initalised value is Geeks
Initalised value is GeeksForGeeks

Итак, если __init__() является закрытым методом, то как мы можем получить к нему доступ вне класса? Итак, давайте проверим еще несколько доказательств того же.

Доступ к __init__() для другого класса

Здесь мы пытаемся получить доступ к одному конструктору из другого конструктора другого класса.

Python3

# initialising class
class Demo:
 
    # defining a constructor
    def __init__(self):
        print("Init for base class")
 
 
class child(Demo):
 
    def __init__(self):
        Demo.__init__(self)
        print("Init for the child class")
 
 
# Driver code
obj1 = Demo()
obj2 = child()

Выход:

Init for base class
Init for base class
Init for the child class

Итак, здесь также мы видим, что мы можем получить доступ к конструктору базового класса из дочернего класса, что нарушает свойство приватных методов.

Приватные методы в Python

Здесь мы пытаемся получить доступ к приватному методу вне класса и получаем ту же ошибку, но в Python мы можем получить доступ к приватному методу, также используя концепцию Name Mangling.

Python3

# Creating a class
class Demo:
 
    # Declaring public method
    def f(self):
        print("Public method")
 
    # Declaring private method
    def __f(self):
        print("Private method")
 
 
# Driver's code
obj = Demo()
obj.f()
 
print("Using the concept of name mangling")
obj._Demo__f()
 
print("Without using name mangling")
obj.__f()

Выход:

Public method
Using the concept of name mangling
Private method
Without using name mangling

Traceback (most recent call last):
  File "main.py", line 20, in <module>
    obj.__f()
AttributeError: 'Demo' object has no attribute '__f'

Заключение

Таким образом, мы можем сделать вывод, что __init__ не является закрытым методом. В Python нет ничего похожего на технику частного/защищенного, это просто соглашение, и мы можем получить доступ к закрытым/защищенным методам. Это больше похоже на условность, а не на технику. Рекомендуется следовать этому соглашению для лучшего понимания.

Читайте также:  Интерполяция строк Ruby
Оцените статью
bestprogrammer.ru
Добавить комментарий