Обектно-ориентирано програмиране (ООП) в Python

Обектно-ориентирано програмиране (ООП) в Python

Урок 4: Обектно-ориентирано програмиране (ООП) в Python

Обектно-ориентираното програмиране (ООП) е парадигма за програмиране, която използва “обекти” и “класове”. Обектите са конкретни екземпляри на класовете и могат да съдържат данни и методи за работа с тези данни. В този урок ще се запознаем с основните концепции на ООП и ще разгледаме как да ги приложим в Python.

Класове и обекти

Дефиниране на клас

Класовете в Python се дефинират с ключовата дума class, последвана от името на класа и двоеточие.

class Person:
pass # Използваме 'pass', за да създадем празен клас

Създаване на обект

Обектите се създават като извикаме класа, като използваме скоби:

person1 = Person()
person2 = Person()

Конструктор и атрибути

Конструкторът е специален метод, който се изпълнява при създаването на обект. В Python той се нарича __init__.

Дефиниране на конструктор и атрибути

class Person:
def __init__(self, name, age):
self.name = name # Атрибут на класа
self.age = age # Атрибут на класа

Създаване на обект с параметри

person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

print(person1.name) # Отпечатва "Alice"
print(person2.age) # Отпечатва 25

Методи в класове

Методите са функции, които са дефинирани в рамките на клас и оперират с обектите на този клас.

Дефиниране на метод

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

def greet(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")

Извикване на метод

person1 = Person("Alice", 30)
person1.greet() # Отпечатва "Hello, my name is Alice and I am 30 years old."

Наследяване

Наследяването е механизъм, при който един клас (подклас) наследява атрибутите и методите на друг клас (базов клас).

Дефиниране на базов и подклас

class Employee(Person):
def __init__(self, name, age, job_title):
super().__init__(name, age) # Викаме конструктора на базовия клас
self.job_title = job_title

def work(self):
print(f"{self.name} is working as a {self.job_title}.")

Създаване на обект на подклас

employee1 = Employee("Charlie", 28, "Software Developer")
employee1.greet() # Отпечатва "Hello, my name is Charlie and I am 28 years old."
employee1.work() # Отпечатва "Charlie is working as a Software Developer."

Инкапсулация

Инкапсулацията е концепция, при която данните в класа са скрити от външния свят и могат да бъдат достъпвани само чрез методи на класа.

Пример за инкапсулация

class Person:
def __init__(self, name, age):
self.__name = name # Приватен атрибут
self.__age = age # Приватен атрибут

def get_name(self):
return self.__name

def set_name(self, name):
self.__name = name

def get_age(self):
return self.__age

def set_age(self, age):
if age > 0:
self.__age = age
else:
print("Invalid age")

person1 = Person("Alice", 30)
print(person1.get_name()) # Отпечатва "Alice"
person1.set_age(35)
print(person1.get_age()) # Отпечатва 35

Полиморфизъм

Полиморфизмът е концепция, при която различни класове могат да имат методи със същото име, но с различно поведение.

Пример за полиморфизъм

class Animal:
def speak(self):
pass

class Dog(Animal):
def speak(self):
return "Woof!"

class Cat(Animal):
def speak(self):
return "Meow!"

animals = [Dog(), Cat()]
for animal in animals:
print(animal.speak()) # Отпечатва "Woof!" и "Meow!"

Абстракция

Абстракцията е концепция, при която се дефинират абстрактни класове и методи, които трябва да бъдат имплементирани в подкласи.

Пример за абстракция

from abc import ABC, abstractmethod

class Shape(ABC):
@abstractmethod
def area(self):
pass

class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height

def area(self):
return self.width * self.height

class Circle(Shape):
def __init__(self, radius):
self.radius = radius

def area(self):
return 3.14 * self.radius * self.radius

shapes = [Rectangle(3, 4), Circle(5)]
for shape in shapes:
print(shape.area()) # Отпечатва 12 и 78.5

Практическа програма: Управление на библиотека с ООП

Нека създадем програма за управление на библиотека с книги, използвайки ООП концепциите.

Дефиниране на класове

book.py

class Book:
def __init__(self, title, author):
self.title = title
self.author = author

def __str__(self):
return f"{self.title} by {self.author}"

library.py

from book import Book

class Library:
def __init__(self):
self.books = []

def add_book(self, book):
self.books.append(book)

def remove_book(self, title):
self.books = [book for book in self.books if book.title != title]

def list_books(self):
for book in self.books:
print(book)

Основна програма

main.py

from book import Book
from library import Library

library = Library()

book1 = Book("The Great Gatsby", "F. Scott Fitzgerald")
book2 = Book("1984", "George Orwell")

library.add_book(book1)
library.add_book(book2)

print("Books in library:")
library.list_books()

library.remove_book("1984")

print("\nBooks in library after removal:")
library.list_books()

Заключение

В този урок разгледахме основните концепции на обектно-ориентираното програмиране (ООП) в Python. Научихме как да дефинираме класове и обекти, как да използваме конструктори и методи, какво представлява наследяването, инкапсулацията, полиморфизмът и абстракцията. В следващите уроци ще продължим да разширяваме нашите знания за Python и ще се запознаем с работа с файлове, бази данни и мрежово програмиране. Практикувайте редовно и експериментирайте с различни класове и обекти, за да затвърдите наученото.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: