Объектно-ориентированное программирование

7. Объектно-ориентированное программирование (ООП) #

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


7.1. Классы и объекты #

Класс — это шаблон, определяющий свойства и поведение объектов. Объект — это экземпляр класса.

Создание класса #

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

    def greet(self):  # Метод объекта
        return f"Hello, my name is {self.name} and I am {self.age} years old."

Создание объекта #

person = Person("Alice", 30)  # Создаем объект
print(person.greet())  # Вызов метода

Атрибуты и методы #

  • Атрибуты — переменные, связанные с объектом.
  • Методы — функции, которые работают с объектом.

Изменение атрибутов #

person.age = 31  # Изменяем значение атрибута
print(person.greet())  # Hello, my name is Alice and I am 31 years old.

7.2. Наследование #

Наследование позволяет создавать классы, которые наследуют свойства и методы другого класса.

Пример наследования #

class Employee(Person):  # Employee наследует Person
    def __init__(self, name, age, position):
        super().__init__(name, age)  # Вызов конструктора родительского класса
        self.position = position

    def work(self):
        return f"{self.name} works as a {self.position}."

Использование наследования #

employee = Employee("Bob", 25, "Developer")
print(employee.greet())  # Вызов метода из родительского класса
print(employee.work())   # Вызов метода из дочернего класса

7.3. Полиморфизм #

Полиморфизм позволяет объектам разных классов обрабатывать одинаковые методы по-своему.

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

class Dog:
    def sound(self):
        return "Woof!"

class Cat:
    def sound(self):
        return "Meow!"

animals = [Dog(), Cat()]
for animal in animals:
    print(animal.sound())  # Вызов метода sound для каждого объекта

7.4. Магические методы #

Магические методы (или методы-дандеры) начинаются и заканчиваются двойным подчеркиванием (__) и определяют специальное поведение объектов.

Примеры магических методов #

  1. __init__ — конструктор.

    def __init__(self, name):
        self.name = name
    
  2. __str__ — строковое представление объекта.

    class Person:
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return f"Person: {self.name}"
    
    person = Person("Alice")
    print(person)  # Person: Alice
    
  3. __repr__ — представление объекта для отладки.

    class Person:
        def __repr__(self):
            return f"Person(name='{self.name}')"
    
  4. __add__ — сложение объектов.

    class Vector:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def __add__(self, other):
            return Vector(self.x + other.x, self.y + other.y)
    
        def __str__(self):
            return f"Vector({self.x}, {self.y})"
    
    v1 = Vector(1, 2)
    v2 = Vector(3, 4)
    print(v1 + v2)  # Vector(4, 6)
    
  5. __len__ — длина объекта.

    class CustomList:
        def __init__(self, items):
            self.items = items
    
        def __len__(self):
            return len(self.items)
    
    my_list = CustomList([1, 2, 3])
    print(len(my_list))  # 3
    

Распространенные магические методы #

  • __getitem__, __setitem__ — доступ к элементам (например, в списке).
  • __eq__, __lt__, __gt__ — сравнение объектов.
  • __iter__, __next__ — итерация по объекту.

Объектно-ориентированное программирование делает код более структурированным, удобным для сопровождения и повторного использования. Магические методы добавляют гибкости, позволяя реализовывать пользовательское поведение для встроенных операций.