Пять важных понятий, необходимых для быстрого старта в Python ООП

ООП расшифровывается как объектно-ориентированное программирование. Эта концепция представляет собой стиль решения задач программирования, когда свойства и поведение реального объекта упакованы в код как единое целое.

Этот стиль программирования обеспечивает модульность и масштабирование при наименьшем количестве проблем.

Недавно мы рассмотрели 30 вопросов с собеседований по теме ООП, а сегодня попробуем разобраться с этим немного глубже.

Python — это динамически типизированный интерпретируемый язык программирования высокого уровня. Python поддерживает несколько понятий ООП, включая следующие:

  • Классы и Объекты
  • Инкапсуляция
  • Наследование
  • Полиморфизм

1. Классы в Python

Класс — это план реальной сущности. В Python он создается с использованием ключевого слова class, как показано в следующем фрагменте кода.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

В приведенном выше примере:

  • class — это класс с именем Person.
  • Конструкторы по умолчанию называются __init__. Это функции, которые неявно вызываются при создании объекта класса.
  • Все методы экземпляра, включая конструктор, принимают своим первым параметром self.
  • self ссылается на экземпляр, через который вызывается метод.
  • name и age являются переменными экземпляра.

2. Объекты в Python

Как только класс Person определен, вы можете использовать его для создания экземпляра, передавая значения, как показано ниже.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

if __name__ == "__main__":
    p = Person("Инокент", 23)
    print(p.name)

В приведенном выше примере:

  • p — это имя объекта, который мы создаем на основе класса Person
  • Даже учитывая, что у класса есть три параметра (self, name, age), мы все равно передадим только name и age при создании объекта, поскольку нам не нужно ссылаться на self. Это происходит неявно.
  • Как только объект создан, вы можете ссылаться на атрибуты объекта, используя точку. Например, p.name относится к атрибуту name этого конкретного объекта

3. Наследование в Python

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

В следующем примере показано, как использовать наследование в Python:

class Person:
  def __init__(self):
    pass

# Одноуровневое наследование
class Employee(Person):
  def __init__(self):
    pass

# Многоуровневое наследование
class Manager(Employee):
  def __init__(self):
    pass

# Множественное наследование
class Enterprenaur(Person, Employee):
  def __init__(self):
    pass

При множественном наследовании классы наследуются слева направо в круглых скобках, в зависимости от алгоритма Method Resolution Order (MRO).

4. Инкапсуляция в Python

Это концепция упаковки данных так, что внешний мир имеет доступ только к открытым свойствам. Некоторые свойства могут быть скрыты, чтобы уменьшить уязвимость. Это так называемая реализация сокрытия данных. Например, вы хотите купить брюки с интернет-сайта. Данные, которые вам нужны, это их стоимость и доступность. Количество предметов и их расположение — это информация, которая вас не беспокоит. Следовательно, эта информация скрыта.

В Python это реализуется путем создания private, protected и public переменных и методов экземпляра.

Private свойства имеют двойное подчеркивание (__) в начале, в то время как protected имеют одиночное подчеркивание (_). По умолчанию, все остальные переменные и методы являются public.

Private атрибуты доступны только внутри класса и недоступны для дочернего класса (если он унаследован). Protected доступны внутри класса, но доступны и дочернему классу. Все эти ограничения сняты для public атрибутов.

Следующие фрагменты кода являются примером этой концепции:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def _protected_method(self):
        print("protected method")
    def __private_method(self):
        print("privated method")

if __name__ == "__main__":
    p = Person("mohan", 23)
    p._protected_method() # покажет предупреждение
    p.__private_method()  # вбросит Attribute error указав, что этот метод не существует

5. Полиморфизм в Python

Это концепция, при которой функция может принимать несколько форм в зависимости от количества аргументов или типа аргументов, переданных функции.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def show_salary(self):
        print("Зарплата неизвестна")

class Employee(Person):
    def __init__(self, name, age, salary):
        super().__init__(name, age)
        self.salary = salary
    def show_salary(self):
        print("Зарплата составляет ", self.salary)

if __name__ == "__main__":
    p = Person("y", 23)
    x = Employee("x", 20, 100000)
    p.show_salary() # Зарплата неизвестна
    x.show_salary() # Зарплата составляет 100000

В приведенном выше примере ключевое слово super используется для вызова метода родительского класса. Оба класса имеют метод show_salary. В зависимости от типа объекта, который выполняет вызов этой функции, выходные данные различаются.

Python также имеет встроенные функции, работающие с полиморфизмом. Одним из самых простых примеров является функция print в Python.

print("Привет!", end=" ")
print("Я Инокент")
print(len([1, 2, 3, 4, 5]))

Вывод будет таким:

Привет! Я Инокент
5

В приведенном выше фрагменте кода:

  • Параметр конечного ключевого слова изменил работу функции print. Следовательно, «Привет!» не заканчивалось концом строки.
  • len ([1, 2, 3, 4, 5]) в третьей строке возвращает int. Печать распознает тип данных и неявно преобразует его в строку и выводит его на консоль.