SmartView · Python | Изучение Python
130 subscribers
373 photos
17 links
📖 Обучение языку программирования Python с самого начала: кратко, интересно и понятно!

📚 Мы стараемся преподавать самое важное в Python, чтобы вас не нагружать.

⚡️ Boost канала: https://t.me/boost/SV_Python

🍀 Желаем приятного изучения!
Download Telegram
UnpicklingError

Ошибка при распаковке pickle-данных.

Как исправить?
· Проверьте, что данные не повреждены.
👍4👏1
TypeError

Операция применена к объекту неверного типа.

Пример:
"10" + 10  # Нельзя сложить str и int
👍5
from

Не является ошибкой, это синтаксис для перехвата исключений:
try:
1 / 0
except ZeroDivisionError as e:
raise ValueError("Нельзя делить на ноль") from e
👍5
RuntimeError

Общая ошибка времени выполнения.

Пример:
raise RuntimeError("Что-то пошло не так!")
👍5
Перерыв в изучении Python!


Период: с 28 сентября по 6 октября


Благодарим за понимание и продуктивную работу!

–>
@SV_Python
👌6
💁‍♂️ Навигация по постам: (4) — «Объектно-ориентированное программирование»

1. Введение в ООП

1.1 Что такое объектно-ориентированное программирование
1.2 Основные концепции ООП
1.3 Преимущества использования ООП
1.4 Классы и объекты - основные понятия
1.5 Примеры ООП в реальных проектах

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

2.1 Создание первого класса в Python
2.2 Конструктор класса init
2.3 Понятие self и его назначение
2.4 Создание объектов (экземпляров класса)
2.5 Атрибуты экземпляра и атрибуты класса
2.6 Доступ к атрибутам через точку

3. Методы класса

3.1 Методы экземпляра
3.2 Методы класса @(@)classmethod
3.3 Статические методы @(@)staticmethod
3.4 Различия между типами методов
3.5 Практическое применение каждого типа

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

4.1 Понятие инкапсуляции
4.2 Публичные атрибуты и методы
4.3 Защищенные атрибуты (_одиночное подчеркивание)
4.4 Приватные атрибуты (__двойное подчеркивание)
4.5 Свойства @(@)property
4.6 Сеттеры и геттеры

5. Наследование

5.1 Базовое наследование классов
5.2 Переопределение методов
5.3 Ключевое слово super()
5.4 Множественное наследование
5.5 Порядок разрешения методов (MRO)
5.6 Абстрактные базовые классы

6. Полиморфизм

6.1 Понятие полиморфизма
6.2 Перегрузка методов
6.3 Переопределение методов
6.4 Утиная типизация (Duck Typing)
6.5 Полиморфизм встроенных функций

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

7.1 Инициализация init и new
7.2 Строковое представление str и repr
7.3 Математические операции add, sub
7.4 Сравнение объектов eq, lt
7.5 Работа с коллекциями len, getitem
7.6 Вызов объектов call

8. Композиция и агрегация

8.1 Отношения между классами
8.2 Композиция (сильная связь)
8.3 Агрегация (слабая связь)
8.4 Наследование vs Композиция

9. Декораторы классов

9.1 Базовые декораторы классов
9.2 Декораторы с параметрами
9.3 Метаклассы type
9.4 Создание собственных метаклассов
9.5 Практическое применение метаклассов

10. Паттерны проектирования

10.1 Одиночка (Singleton)
10.2 Фабрика (Factory)
10.3 Наблюдатель (Observer)
10.4 Стратегия (Strategy)
10.5 Адаптер (Adapter)
10.6 Декоратор (Decorator)

11. Работа с исключениями в ООП

11.1 Создание пользовательских исключений
11.2 Наследование от базовых исключений
11.3 Обработка исключений в методах
11.4 Контекстные менеджеры с классами
11.5 Паттерн "Фабрика исключений"

12. Тестирование ООП кода

12.1 Модуль unittest для тестирования классов
12.2 Mock объекты для тестирования
12.3 Тестирование наследования
12.4 Тестирование приватных методов
12.5 Паттерн "Тестовые дублеры"

13. Продвинутые темы ООП

13.1 Дескрипторы
13.2 Слоты slots
13.3 Абстрактные методы
13.4 Протоколы и интерфейсы
13.5 Миксины (Mixins)
🔥3👍1
Что такое объектно-ориентированное программирование?

ООП — это способ писать код, где программа состоит из «объектов», как в реальном мире. Каждый объект имеет свои характеристики и действия.

Пример из жизни:
Представьте машину:
· Характеристики (атрибуты): цвет, марка, скорость
· Действия (методы): ехать, тормозить, сигналить

Код без ООП vs с ООП:
# Без ООП (процедурный подход)
color = "red"
brand = "Toyota"
speed = 0

def drive(car_speed):
return car_speed + 10

def stop(car_speed):
return 0

# С ООП
class Car:
def __init__(self, color, brand):
self.color = color
self.brand = brand
self.speed = 0

def drive(self, acceleration):
self.speed += acceleration

def stop(self):
self.speed = 0
👍4
Основные концепции ООП


1. Инкапсуляция — объединение данных и методов в одном объекте
2. Наследование — создание новых классов на основе существующих
3. Полиморфизм — использование объектов разных классов одинаковым образом
4. Абстракция — скрытие сложной реализации, показ только важных деталей

Простая аналогия:
· Инкапсуляция: Телефон — внутри сложная электроника, но мы пользуемся только кнопками
· Наследование: Смартфон наследует свойства обычного телефона + добавляет новые
· Полиморфизм: Кнопка "позвонить" работает на любом телефоне по-разному, но результат одинаковый
· Абстракция: Нам не нужно знать, как работает процессор, чтобы звонить
👍4
Преимущества использования ООП

· Понятность: Код похож на реальные объекты
· Повторное использование: Классы можно использовать много раз
· Легкость поддержки: Легко находить и исправлять ошибки
· Масштабируемость: Легко добавлять новые функции

Пример преимущества:
# Без ООП — много повторяющегося кода
car1_color = "red"
car1_brand = "Toyota"
car1_speed = 0

car2_color = "blue"
car2_brand = "BMW"
car2_speed = 0

# С ООП — чисто и понятно
car1 = Car("red", "Toyota")
car2 = Car("blue", "BMW")
👍4
Классы и объекты — основные понятия

Класс — это чертеж, объект — готовый продукт

Простая аналогия:
· Класс = Чертеж дома (описание, каким должен быть дом)
· Объект = Построенный дом (реальный экземпляр)

Пример:
# Класс — чертеж собаки
class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed

def bark(self):
return "Гав!"

# Объекты — реальные собаки
my_dog = Dog("Бобик", "Такса") # Первая собака
friends_dog = Dog("Шарик", "Овчарка") # Вторая собака

print(my_dog.name) # Бобик
print(friends_dog.bark()) # Гав!
👍4
Примеры ООП в реальных проектах


Веб-разработка:
# Пользователь на сайте
class User:
def __init__(self, username, email):
self.username = username
self.email = email
self.is_logged_in = False

def login(self):
self.is_logged_in = True

def logout(self):
self.is_logged_in = False



Игры:
# Персонаж игры
class Character:
def __init__(self, name, health):
self.name = name
self.health = health

def attack(self, enemy):
enemy.health -= 10

def heal(self):
self.health += 5



Банковское приложение:
# Банковский счет
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance

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

def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
else:
print("Недостаточно средств!")
👍4
Создание первого класса в Python


Простейший класс:
class Dog:
pass # pass означает "пока ничего не делай"


Что происходит:
· class — ключевое слово для создания класса
· Dog — имя класса (начинается с заглавной буквы)
· pass — заглушка, чтобы код не падал с ошибкой


Пример с содержимым:
class Dog:
# Атрибут класса (общий для всех собак)
species = "Canis familiaris"

def bark(self):
return "Гав-гав!"
👍4
Конструктор класса init

Для чего нужен:
Инициализирует объект при его создании. Как "настройка" новой собаки.

Пример:
class Dog:
def __init__(self, name, age):
self.name = name # У каждой собаки свое имя
self.age = age # И свой возраст

# Создаем собаку с именем и возрастом
my_dog = Dog("Napoleon", 3)
👍4
Понятие self и его назначение

self — ссылка на текущий объект (экземпляр класса). Это как слово "я" для объекта.

Почему важно:
class Dog:
def __init__(self, name, age):
self.name = name # self.name = имя ЭТОЙ конкретной собаки
self.age = age

def introduce(self):
return f"Меня зовут {self.name}, мне {self.age} лет"

# Без self компьютер не поймет, чье имя и возраст показывать
👍4
Создание объектов (экземпляров класса)


Как создавать:
# Класс — чертеж
class Car:
def __init__(self, color, brand):
self.color = color
self.brand = brand

# Объекты — реальные машины
car1 = Car("red", "Toyota") # Первая машина
car2 = Car("blue", "BMW") # Вторая машина
car3 = Car("green", "Audi") # Третья машина
👍5
Атрибуты экземпляра и атрибуты класса

- Атрибуты экземпляра: Уникальные для каждого объекта
- Атрибуты класса: Общие для всех объектов

Пример:
class Dog:
# Атрибут класса (общий для всех)
species = "Canis familiaris"

def __init__(self, name):
# Атрибут экземпляра (уникальный для каждой собаки)
self.name = name

dog1 = Dog("Бобик")
dog2 = Dog("Шарик")

print(dog1.species) # Canis familiaris (общий)
print(dog2.species) # Canis familiaris (общий)
print(dog1.name) # Бобик (уникальный)
print(dog2.name) # Шарик (уникальный)
👍5
Доступ к атрибутам через точку


Как работать с объектами:
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade

def upgrade_grade(self):
self.grade += 1

# Создаем студента
student = Student("Анна", 5)

# Чтение атрибутов
print(student.name) # Анна
print(student.grade) # 5

# Изменение атрибутов
student.grade = 6
print(student.grade) # 6

# Вызов методов
student.upgrade_grade()
print(student.grade) # 7
👍4👏2🔥1🤩1
Методы экземпляра

Самые распространенные методы:

class BankAccount:
def __init__(self, balance=0):
self.balance = balance

# Метод экземпляра - работает с конкретным объектом
def deposit(self, amount):
self.balance += amount
return f"Баланс пополнен на {amount}"

def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
return f"Снято {amount}"
return "Недостаточно средств"

# Использование
account = BankAccount(1000)
print(account.deposit(500)) # Баланс пополнен на 500
👍3👏2🔥1👌1
Методы класса @(@)classmethod

Для работы с классом в целом:

class Dog:
species = "Canis familiaris"
total_dogs = 0 # Счетчик всех созданных собак

def __init__(self, name):
self.name = name
Dog.total_dogs += 1

@classmethod
def get_total_dogs(cls): # cls - ссылка на класс, не на объект!
return cls.total_dogs

@classmethod
def change_species(cls, new_species):
cls.species = new_species

# Использование
dog1 = Dog("Бобик")
dog2 = Dog("Шарик")

print(Dog.get_total_dogs()) # 2 (всего создано собак)
Dog.change_species("Домашняя собака")
👍4🔥1👏1🤩1
Статические методы @(@)staticmethod

Функции, не требующие доступа к классу или объекту:

class MathHelper:
@staticmethod
def add(a, b):
return a + b

@staticmethod
def is_even(number):
return number % 2 == 0

# Использование - не нужно создавать объект!
print(MathHelper.add(5, 3)) # 8
print(MathHelper.is_even(4)) # True
👍5🔥1👏1
Различия между типами методов

Методы экземпляра (обычные методы):
· Создаются БЕЗ декораторов
· Первый параметр ВСЕГДА self - это ссылка на конкретный объект
· Имеют доступ ко всем атрибутам и методам объекта
· Могут изменять состояние объекта
· Вызываются только через объект (не через класс)


Методы класса (@(@)classmethod):
· Создаются с декоратором @(@)classmethod
· Первый параметр ВСЕГДА cls - это ссылка на сам класс
· НЕ имеют доступа к атрибутам конкретного объекта
· Могут изменять атрибуты класса (общие для всех объектов)
· Вызываются как через класс, так и через объект


Статические методы (@(@)staticmethod):
· Создаются с декоратором @(@)staticmethod
· НЕТ специального первого параметра
· НЕ имеют доступа ни к объекту, ни к классу
· Это просто функции, которые живут внутри класса для удобства
· Вызываются как через класс, так и через объект
👍4🔥1😁1🤩1