В прошлый раз мы говорили про особенности ООП в Python. Сегодня рассмотрим базовые принципы ООП и их применение в этом популярном языке программирования на практических примерах.
Основные принципы ООП в языке Python
Python — один из самых популярных языков программирования в мире. Он известен своей простотой и легкостью в использовании. Данный язык предлагает различные концепции объектно-ориентированного программирования (ООП), такие как:
- наследование — это концепция ООП, которая позволяет создавать новые классы на основе существующих. Класс, который наследует свойства и методы от другого класса, называется подклассом (или классом-потомком), а класс, от которого он наследует, называется суперклассом (или классом-родителем). Подкласс может добавлять новые свойства и методы или изменять существующие. Наследование позволяет повторно использовать код и уменьшать количество дублированного кода.
- инкапсуляция — это концепция ООП, которая позволяет скрыть детали реализации и защитить данные от изменений извне.
- полиморфизм — это концепция ООП, которая основана на наследовании и позволяет использовать объекты разных классов, но имеющих схожее поведение. Например, каждое животное может издавать какие-то звуки. Однако такое животное, как собака обычно издает звук «Гав!», а кошка — звук «Мяу». Иными словами, полиморфизм — это переопределение методов, унаследованных от суперкласса в подклассах.
Каждую из этих концепций мы подробно рассмотрим далее.
Особенности применения принципов ООП: несколько практических примеров
В Python наследование реализуется путем указания суперкласса в круглых скобках после имени класса. Например, чтобы создать класс подкласса, который наследует свойства и методы от суперкласса Animal
, мы можем использовать следующий код:
class Animal: def run(self): print ('Running') class Dog(Animal): def runAsDog(self): super().run()
Ключевое слово super
в Python используется для вызова методов родительского класса в дочернем классе.
Как уже отмечалось выше, в основе полиморфизма лежит переопределение методов суперкласса подклассах:
class Animal: def run(self): return 'Running' class Dog(Animal): def run(self): return 'Running like a dog' class Cat(Animal): pass
В данном примере видно, что метод run() был переопределен в подклассе Dog
, но не был переопределен в подклассе Cat
. Следовательно, при создании экземпляров реализация данного метода в них будет отличаться: класс Cat
унаследовал его и не переопределил его, а класс Dog
унаследовал его и переопределил (задал собственную реализацию).
dog = Dog() cat = Cat() print(dog.run()) # Running like a dog print(cat.run()) # Running
Стоит также отметить, что при наследовании в Python автоматически наследуются все методы суперкласса.
В Python инкапсуляция достигается путем использования двух подчеркиваний (private) перед именем переменной или метода, или же одного подчеркивания (protected) перед ними. Рассмотрим на следующем примере:
class BankAccount: def __init__(self, balance): self.__balance = balance def get_balance(self): return self.__balance def _do(self): return 'Do something' def set_balance(self, balance): self.__balance = balance
В примере выше мы создаем класс BankAccount
, который содержит переменную balance
. Мы используем два подчеркивания перед именем переменной, чтобы сделать ее приватной. Теперь эта переменная не может быть напрямую изменена вне класса. Для того, чтобы иметь доступ к приватным переменным, можно использовать геттеры (get) и сеттеры (set). Геттеры — это методы, которые возвращают значение приватной переменной, а сеттеры — это методы, которые устанавливают значение приватной переменной. Здесь мы добавили методы get_balance
и set_balance
, которые позволяют получить и установить значение переменной balance
:
k=BankAccount(20) print(k.get_balance()) # 20 k.set_balance(30) print(k.get_balance()) # 30
Как уже отмечалось выше, в Python есть 2 вида защищенности:
- private — двойное подчеркивание, которое говорит о том, что напрямую к приватному элементу можно обратиться можно только внутри класса;
- protected — нижнее подчеркивание, которое говорит о том, что напрямую к защищенному элементу можно обратиться вне класса, но при условии соблюдения данного подчеркивания.
В качестве примера рассмотрим обращение в protected-методу из примера выше:
k=BankAccount(20) k._do()
Подобным образом можно обращаться также к protected-переменным без геттеров и сеттеров. Но для того, чтобы обратиться к приватным методам извне, следует делать это следующим образом:
k=BankAccount(20) k._BankAccount__do()
Данный способ называется изменением имени. Изменение имени (name mangling) — это процесс, в котором любой заданный идентификатор с одним конечным подчеркиванием и двумя ведущими подчеркиваниями текстуально заменяется на __ClassName__Identifier
. Есть еще один способ — это реализация метода, который отвечает за вызов приватного метода (на подобии геттеров):
class BankAccount: def __init__(self, balance): self.__balance = balance def get_balance(self): return self.__balance def __do(self): return 'Do something' def call_do(self): return self.__do() def set_balance(self, balance): self.__balance = balance
Теперь мы просто вызываем наш приватный метод через реализованный метод вызова следующим образом:
k=BankAccount(20) k.call_do()
Таким образом, благодаря поддержке механизма ООП, Python позволяет создавать модули, которые могут быть легко заменены и использованы заново, что упрощает разработку, тестирование и сопровождение кода. Это делает Python универсальным и надежным средством для работы с производительными приложениями, а также с Big Data обработкой.
Computer vision на Python
Код курса
VISI
Ближайшая дата курса
24 февраля, 2025
Продолжительность
40 ак.часов
Стоимость обучения
90 000 руб.
Освоить Python на профессиональном уровне в разработчика различных приложений и прочих прикладных областях Data Science вы сможете на практических курсах по Python в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве: