Здесь, в этой статье, мы собираемся выяснить, действительно ли __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
(
"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
):
(
"Init for base class"
)
class
child(Demo):
def
__init__(
self
):
Demo.__init__(
self
)
(
"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
):
(
"Public method"
)
# Declaring private method
def
__f(
self
):
(
"Private method"
)
# Driver's code
obj
=
Demo()
obj.f()
(
"Using the concept of name mangling"
)
obj._Demo__f()
(
"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 нет ничего похожего на технику частного/защищенного, это просто соглашение, и мы можем получить доступ к закрытым/защищенным методам. Это больше похоже на условность, а не на технику. Рекомендуется следовать этому соглашению для лучшего понимания.