ООП расшифровывается как объектно-ориентированное программирование. Эта концепция представляет собой стиль решения задач программирования, когда свойства и поведение реального объекта упакованы в код как единое целое.
Этот стиль программирования обеспечивает модульность и масштабирование при наименьшем количестве проблем.
Недавно мы рассмотрели 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. Печать распознает тип данных и неявно преобразует его в строку и выводит его на консоль.