Об'єктно-орієнтоване програмування (OOP) є найпоширенішою парадигмою програмування у сучасній розробці програмного забезпечення. Ця парадигма пропонує розробникам організовувати свої програми навколо об'єктів. У OOP кожен об'єкт об'єднує дані та функції, які оперують цими даними. Такий підхід дозволяє зробити код модульним та зручним для подальшого розвитку.
1. Абстракція (Abstraction):
Абстракція дозволяє приховати непотрібні деталі, фокусуючись лише на важливих аспектах. Користувачі не повинні знати, як саме працює складна система, вони просто використовують відповідні функції.
Приклад: Ви можете керувати автомобілем, не знаючи, як саме він працює, просто повертаючи кермо. У програмуванні при використанні функцій вам не потрібно знати, як саме вони реалізовані.
У наведеному прикладі ми не знаємо деталей процесу приготування кави в класі CoffeeMachine
, ми просто використовуємо функцію make_coffee
.
from abc import ABC, abstractmethod
# Абстрактний клас
class CoffeeMachine(ABC):
@abstractmethod
def make_coffee(self):
pass
# Наслідуваний клас
class BasicCoffeeMachine(CoffeeMachine):
def make_coffee(self):
return "Ваша кава готова!"
# Користувач викликає тільки функцію make_coffee, не знаючи про внутрішні деталі.
machine = BasicCoffeeMachine()
print(machine.make_coffee())
2. Інкапсуляція (Encapsulation):
Інкапсуляція захищає дані об'єкта від зовнішнього доступу. Доступ до цих даних можливий лише через визначені функції, що запобігає небажаним змінам ззовні.
Приклад: Ви не можете отримати доступ до балансу банківського рахунку (__balance
), ви можете лише вносити або знімати гроші через певні функції.
class BankAccount:
def __init__(self, balance):
self.__balance = balance # доступ через __ забороняє зовнішній доступ
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
else:
print("Недостатньо коштів!")
def get_balance(self):
return self.__balance
# Ми не можемо звернутися до змінної __balance напряму, тільки через функції.
account = BankAccount(100)
account.deposit(50)
account.withdraw(30)
print(account.get_balance()) # 120
3. Наслідування (Inheritance):
Наслідування дозволяє одному класу успадковувати властивості іншого класу. Це дає змогу розширювати існуючий код та створювати нові класи без необхідності переписувати їх з нуля.
Приклад: Клас Car
успадковує властивості класу Vehicle
і додає нові.
# Базовий клас
class Vehicle:
def __init__(self, brand):
self.brand = brand
def start_engine(self):
return f"Двигун {self.brand} запущено"
# Наслідуваний клас
class Car(Vehicle):
def play_radio(self):
return "Відтворення радіо"
# Клас Car успадковує властивості класу Vehicle.
my_car = Car("Toyota")
print(my_car.start_engine()) # Двигун Toyota запущено
print(my_car.play_radio()) # Відтворення радіо
4. Поліморфізм (Polymorphism):
Поліморфізм дозволяє одному й тому ж методу мати різні реалізації для різних об'єктів. Функція базового класу може бути перевизначена в підкласах.
Приклад: Функція speak()
в класі Animal
реалізується по-різному в класах Dog
та Cat
; собака гавкає, а кіт мявкає.
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Гав!"
class Cat(Animal):
def speak(self):
return "Мяу!"
# Одна й та сама функція speak дає різні результати в залежності від об'єкта.
animals = [Dog(), Cat()]
for animal in animals:
print(animal.speak())
Перекладено з: [Object Oriented Programming (OOP) Nedir?](https://medium.com/@meyragonul/object-oriented-programming-oop-nedir-3ac59740739e)