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

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

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

🍀 Желаем приятного изучения!
Download Telegram
Что такое объектно-ориентированное программирование?

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

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

Код без ООП 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
Практическое применение каждого типа


Методы экземпляра — для действий объекта:
class Car:
def __init__(self, fuel):
self.fuel = fuel

def drive(self, distance):
self.fuel -= distance * 0.1 # Уменьшаем топливо



Методы класса — для утилит класса:
class User:
users = []

def __init__(self, name):
self.name = name
User.users.append(self)

@classmethod
def get_user_count(cls):
return len(cls.users) # Статистика по всем пользователям



Статические методы — для вспомогательных функций:
class DateValidator:
@staticmethod
def is_valid_date(day, month, year):
# Проверка без создания объекта
return 1 <= day <= 31 and 1 <= month <= 12
👍5🔥1😁1
Понятие инкапсуляции

Простыми словами:
Объединение данных и методов в одной "капсуле" (классе) + контроль доступа.

Аналогия:
Автомобиль — вам не нужно знать, как работает двигатель, чтобы ездить. Вы используете руль, педали.
👍4👏2🔥1
Публичные атрибуты и методы

Доступны отовсюду:
class BankAccount:
def __init__(self, owner, balance):
self.owner = owner # Публичный атрибут
self.balance = balance # Публичный атрибут (опасно!)

def show_balance(self): # Публичный метод
return f"Баланс: {self.balance}"

account = BankAccount("Иван", 1000)
print(account.balance) # 1000 - можно прочитать
account.balance = -500 # 😱 Можно изменить на отрицательное!
👍5😁1🤩1
Защищенные атрибуты (_одиночное подчеркивание)

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

def get_balance(self):
return self._balance

def _validate_amount(self, amount): # Защищенный метод
return amount > 0

account = BankAccount("Иван", 1000)
print(account._balance) # Не рекомендуется, но возможно
👍4🤔3😁1
Приватные атрибуты (__двойное подчеркивание)

class BankAccount:
def __init__(self, owner, balance):
self.owner = owner
self.__balance = balance # Приватный атрибут

def deposit(self, amount):
if amount > 0:
self.__balance += amount

def get_balance(self):
return self.__balance

account = BankAccount("Иван", 1000)
print(account.__balance) # Ошибка! AttributeError
print(account.get_balance()) # 1000 - через метод
👍5🔥1👌1
Свойства @(@)property

Красивая работа с приватными атрибутами:
class Temperature:
def __init__(self, celsius):
self._celsius = celsius

@property
def celsius(self):
return self._celsius

@property
def fahrenheit(self):
return (self._celsius * 9/5) + 32

temp = Temperature(25)
print(temp.celsius) # 25 - как атрибут, но это метод!
print(temp.fahrenheit) # 77.0
👍3😁2🔥1👌1