Python - Классы и объекты

Привет, стремящиеся к знаниям программисты Python! Сегодня мы отправляемся в захватывающее путешествие в мир Ориентированного на Объекты Программирования (ООП) в Python. Защелкните ремни, потому что мы собираемся изменить ваше мышление о коде!

Python - Classes & Objects

Что такое класс в Python?

Представьте себе, что вы строите виртуальный зоопарк. Вы бы не создавали каждое животное с нуля, правильно? Вот тут и приходят на помощь классы!

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

Создадим простой класс, представляющий собаку:

class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed

def bark(self):
print(f"{self.name} говорит Уф!")

В этом примере Dog — это наш класс. У него есть атрибуты, такие как name и breed, и метод, называемый bark().

Создание классов в Python

Создание класса заключается в использовании ключевого слова class, за которым следует имя класса. Создадим более детализированный класс Car:

class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer = 0

def drive(self, distance):
self.odometer += distance
print(f"Проехал {distance} миль. Итого: {self.odometer} миль")

def honk(self):
print("Бип-бип!")

Здесь __init__ — это специальный метод, называемый конструктором. Он вызывается, когда мы создаем новый объект этого класса.

Что такое объект?

Если класс — это чертеж, объект — это реальное "вещество", созданное из этого чертежа. Это конкретный экземпляр класса.

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

Создание объекта (также называемое инстанцированием) — это как использование нашего чертежа для создания чего-то реального. Создадим несколько машин:

my_car = Car("Toyota", "Corolla", 2020)
your_car = Car("Honda", "Civic", 2019)

print(my_car.make)  # Вывод: Toyota
your_car.drive(50)  # Вывод: Проехал 50 миль. Итого: 50 миль
my_car.honk()  # Вывод: Бип-бип!

Каждая машина — это отдельный объект с своим набором атрибутов и методов.

Доступ к атрибутам объектов в Python

Мы можем получить доступ к атрибутам объекта, используя точечную нотацию. Рассмотрим нашу машину:

print(f"Моя машина — это {my_car.year} {my_car.make} {my_car.model}")
# Вывод: Моя машина — это 2020 Toyota Corolla

Встроенные атрибуты классов в Python

Классы Python имеют некоторые встроенные атрибуты. Рассмотрим их:

class MyClass:
x = 5

print(MyClass.__name__)  # Вывод: MyClass
print(MyClass.__module__)  # Вывод: __main__
print(MyClass.__dict__)  # Вывод: {'__module__': '__main__', 'x': 5, ...}

Встроенные классы Python данных

Знаете ли вы, что даже базовые типы данных Python являются объектами? Проверим это:

print(type(5))  # Вывод: <class 'int'>
print(type("Hello"))  # Вывод: <class 'str'>
print(type([1, 2, 3]))  # Вывод: <class 'list'>

Все в Python — это объекты!

Утилизация памяти (уничтожение объектов) в Python

В Python нам не нужно вручную уничтожать объекты. Сборщик мусора Python автоматически заботится об этом, когда объект больше не используется.

import gc

# Создайте объект
my_car = Car("Toyota", "Corolla", 2020)

# Удалите ссылку
my_car = None

# Принудительная утилизация памяти (обычно не требуется)
gc.collect()

Скрытие данных в Python

В ООП мы часто хотим контролировать доступ к определенным атрибутам. Python использует конвенцию префиксации атрибутов подчеркиваниями:

class BankAccount:
def __init__(self, balance):
self._balance = balance  # Защищенный атрибут
self.__secret = "shh"  # Приватный атрибут

def deposit(self, amount):
self._balance += amount

def get_balance(self):
return self._balance

account = BankAccount(1000)
print(account._balance)  # Вывод: 1000 (но это не рекомендуется!)
print(account.__secret)  # Это вызовет исключение AttributeError

Вот таблица, подводящая итог методам, которые мы обсудили:

Метод Описание
__init__(self, ...) Конструктор, вызывается при создании нового объекта
__str__(self) Возвращает строковое представление объекта
__repr__(self) Возвращает детализированное строковое представление объекта
__len__(self) Определяет поведение встроенной функции len()
__getitem__(self, key) Определяет поведение индексирования
__setitem__(self, key, value) Определяет поведение назначения значений индексированным

И вот и все! Вы только что сделали свои первые шаги в мир Ориентированного на Объекты Программирования в Python. Помните, что практика совершенства. Попробуйте создать свои собственные классы и объекты, и скоро вы будете строить сложные и эффективные программы как профессионал!

Credits: Image by storyset