Частные методы в Python

  1. модификатор частного доступа в Python
  2. Объявить частный метод в Python

В этом руководстве показано, как объявлять, манипулировать и использовать частные методы в Python.

private - ключевое слово для типа модификатора доступа, используемого в объектно-ориентированных языках программирования. Модификаторы доступа в определенной степени ограничивают видимость функции или переменной. Объявление вашей функции / переменной как частной ограничивает доступ только к инкапсулирующему ее классу.

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

модификатор частного доступа в Python

В Python частные методы - это методы, к которым нельзя получить доступ вне класса, в котором он объявлен, ни для какого-либо другого базового класса.

Чтобы объявить частный метод в Python, вставьте двойное подчеркивание в начало имени метода.

метод __init__()

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

Например, объявите класс Person с двумя полями и методом __init__():

class Person:
    name = ''
    age = 0
    
    def __init__(self, n, a):
        self.name = n
        self.age = a
    

Теперь, чтобы получить доступ к частному методу __init__() за пределами класса, нам потребуется доступ к нему из объекта самого класса после его создания.

Например, в другом файле в том же каталоге создайте экземпляр класса Person и вызовите конструктор по имени класса.

sys.path.append(".")

from personClass import Person

person = Person("John Doe", 25)

print(person.name, person.age)

Выход:

John Doe   25
Примечание

Чтобы импортировать классы из другого файла в текущий файл, используйте sys.path.append() со строковым путем к каталогу класса, который вы хотите импортировать в качестве аргумента. В этом случае оба файла находятся в одной папке, поэтому точка . достаточно. После этого импортируйте класс (Person) из файла .py (personClass.py).

Метод __init__() может быть вызван явно после создания экземпляра класса Person в переменной для повторного создания экземпляра объекта.

Например:

person = Person("John Doe", 25)
person.__init__("Jane Doe", 29)

print(person.name, person.age)

Выход:

Jane Doe   29

Также метод __init()__ может быть вызван явно, вызвав его из самого класса. Хотя для этого подхода вам нужно будет явно указать в аргументах первый параметр self.

person = Person("John Doe", 25)
Person.__init__(person, "Jack Sparrow", 46)   #person is the 'self' argument

print(person.name, person.age)

Выход:

Jack Sparrow   46

Все эти подходы сохраняют частную собственность метода __init__().

Теперь, когда этот встроенный метод проанализирован. Давайте перейдем к фактической реализации наших собственных частных методов в классе и дифференциации его доступа от общедоступного метода.

Объявить частный метод в Python

Чтобы объявить частный метод, поставьте перед рассматриваемым методом двойное подчеркивание __. В противном случае он будет рассматриваться как общедоступный метод по умолчанию.

Давайте расширим класс Person из предыдущего примера и создадим подкласс Employee, который основывает свой конструктор на классе Person.

Кроме того, создайте два новых метода в классе person: общедоступный и частный.

class Person:
    name = ''
    age = 0
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def walk(self):
        print("Walking")
        
    def __call(self):
        print("Taking a call")

Теперь создайте производный класс или подкласс Employee, расширяющий Person:

class Employee(Person):
    occupation = 'Unemployed'
    salary = 0
    
    def __init__(self, name, age, occupation, salary):
        Person.__init__(self, name, age)
        self.occupation = occupation
        self.salary = salary
        
    def work(self):
        print("Employee is working")
        self.walk()
        
    def takeCall(self):
        self.__call()
        print("Employee is taking a call")

Примечание

Чтобы расширить класс до другого класса, добавьте в объявление класса аргумент, который является именем класса родительского класса. В данном случае аргументом является класс Person.

<div class="alert alert-warning" role="alert"><p>В этом классе методы <code>work()</code> и <code>takeCall()</code> извне вызывают классы <code>walk()</code> и <code>__call()</code> из родительского класса <code>Person</code> соответственно.</p>

Другой метод извне вызывает общедоступный метод, а другой вызывает частный метод из своего родительского класса. Давайте посмотрим, как это поведение работает, когда мы его запустим.

Например, учитывая объявления класса выше:

employee_1 = Employee("John Doe", 25, "Software Engineer", 40000)

employee_1.work()
employee_1.takeCall()

Выход:

Employee is working
Walking
Traceback (most recent call last):
  File "python/demo.py", line 35, in <module>
    employee_1.takeCall()
  File "python/demo.py", line 29, in takeCall
    self.__call()
AttributeError: 'Employee' object has no attribute '_Employee__call'

Вызов метода work() успешно выполнен, распечатывая операторы из методов work() и walk(). Однако вызов takeCall() вызывает AttributeError, потому что он не распознает метод __call() из класса Person как метод класса Employee. Расширение класса до другого класса не включает в себя его собственные частные методы.

Таким образом, частные методы в Python объявляются с помощью префикса метода с двумя символами подчеркивания __. Объявление частных методов позволяет зарезервировать метод исключительно для инкапсулирующего класса. Класс, расширяющий другой класс частным методом, не будет наследовать эти методы и вызывать ошибку при попытке доступа к нему.

Сопутствующая статья - Python Class

  • Статические переменные класса в Python
  • Статический метод Python
  • Метаклассы в Python