Код на пальцах
часть 1

⚡ Цель

  • Начать знакомиться с принципами ООП.
  • Узнать как реализуются принципы ООП в Python.
  • Узнать про структуры данных.

КОНСПЕКТ

Основные типы данных в Python
integer
# неизменяемый тип данных
 x = 5
float
# неизменяемый тип данных
y = 7.1
bool
# неизменяемый тип данных
t = True  # может восприниматься в Python как 1 
f = False # может восприниматься в Python как 0
string
# неизменяемый тип данных
s = "string"

# f-строка - позволяет вставлять внутрь строки другие переменные
x = 10
f = f'Переменная x равна {x}'
list
# список - изменяемый тип данных
# представляет собой перечисление элементов любых типов данных
list1 = [1, 2, 3, 'qwerty', True, 1]

list1[0] # обращение к нулевому (самому левому) элементу
tuple
# кортеж - неизменяемый тип данных
# представляет собой перечисление элементов любых типов данных. невозможно изменять этот объект после объявления
u = (1, 2, 3, 4, 5)

u[0] # обращение к нулевому (самому левому) элементу
set
# множество - изменяемый тип данных
# представляет собой перечисление элементов любых типов данных
# нельзя обращаться по индексу - не имеет четко порядка элементов внутри себя
set1 = set() # создание пустого множества
set2 = {1, 2, 3, 4, 5}
dict
# словарь - изменяемый тип данных
# представляет набор пар типа "ключ: значение"
# нельзя обращаться по индексу - не имеет четко порядка элементов внутри себя
dict1 = {} # создание пустого словаря - !!! не путать с пустым множеством !!!
dict2 = {
    1: 'один',
    2: 'два',
    'key': 'value'
}

# в качестве ключа можно использовать только НЕизменяемые типы данных

dict2[1] # обращение к значению под ключом 1 (НЕ индекс) 
dict2['key'] # обращение к значению под ключом 'key' 

ООП в Python (часть 1)

Инкапсуляция (прячем детали):
Пример: у машинки есть двигатель, но ты не лезешь внутрь, а просто нажимаешь кнопку "поехали".

Пример
class Car:
	def __init__(self, brand, color):
		self.brand = brand  
		self.color = color  
		self.__engine_started = False  # Приватное свойство, "спрятанное"
	def start_engine(self):
		self.__engine_started = True
		print("Двигатель запущен!")
	def drive(self):
		if self.__engine_started:
			print("Машина едет!")
		else:
			print("Сначала запусти двигатель!")

# Используем класс
my_car = Car("BMW", "Black")
my_car.drive()  # Сначала запусти двигатель!
my_car.start_engine()  # Двигатель запущен!
my_car.drive()  # Машина едет!
Инкапсуляция прячет детали: мы не можем менять __engine_started напрямую.
Наследованиедети берут свойства родителей:
Пример: у тебя есть папа и мама, и ты унаследовал от них черты (например, цвет глаз).

Пример
# Родительский (базовый) класс
class Vehicle:
	wheels = 4  # Количество колес (просто атрибут)
	speed = 0   # Текущая скорость
	
	def start(self):
		print("Машина заведена")
	def stop(self):
		print("Машина остановлена")

# Дочерний класс (наследует Vehicle)
class Car(Vehicle):
	def honk(self):
		print("Бип-бип! Машина сигналит!")

# Создание объекта дочернего класса
my_car = Car()

# Используем унаследованные атрибуты и методы
print(my_car.wheels)  # 4 (унаследованный атрибут)
print(my_car.speed)   # 0 (унаследованный атрибут)

my_car.start()        # Машина заведена (унаследованный метод)
my_car.stop()         # Машина остановлена (унаследованный метод)
Наследование позволяет дочернему классу (Car) брать свойства у родителя (Vehicle).
Типы наследований
В объектно-ориентированном программировании (ООП) существует несколько типов наследования, каждый из которых определяет, как классы могут наследовать свойства и методы от других классов.


1. Одиночное (простое) наследование
Описание: Один дочерний класс наследует от одного родительского класса.
Пример
class Animal:
	def make_sound(self):
		print("Животное издает звук")
class Dog(Animal):
	def bark(self):
		print("Собака лает: Гав-гав!")
dog = Dog()
dog.make_sound()  # Унаследованный метод
dog.bark()        # Метод класса Dog
Используется, когда новый класс – это специализированная версия существующего.
2. Многоуровневое наследование (цепочка наследования)
Описание: Класс наследует другой класс, который сам является потомком другого класса.
Пример
class A:
	def method_a(self):
		print("Метод из класса A")
class B(A):
	def method_b(self):
		print("Метод из класса B")
class C(B):
	def method_c(self):
		print("Метод из класса C")
obj = C()
obj.method_a()  # Наследуется от A
obj.method_b()  # Наследуется от B
obj.method_c()  # Собственный метод класса C
Позволяет создавать классы с глубокой иерархией.
3. Множественное наследование
Описание: Класс наследует сразу от нескольких классов.
Пример
class Flyer:
	def fly(self):
		print("Этот объект умеет летать")
class Swimmer:
	def swim(self):
		print("Этот объект умеет плавать")
class Duck(Flyer, Swimmer):
	pass
duck = Duck()
duck.fly()  # Унаследовано от Flyer
duck.swim() # Унаследовано от Swimmer
Позволяет комбинировать функциональность из разных классов.
Может привести к сложности в управлении зависимостями.
(дополнительно можно почитать про алгоритм разрешения методов MRO)
4. Гибридное (комбинированное) наследование
Описание: Использует несколько типов наследования одновременно.
Пример
class A:
	def method_a(self):
		print("Метод из A")
class B(A):
	def method_b(self):
		print("Метод из B")
class C(A):
	def method_c(self):
		print("Метод из C")
class D(B, C):
	def method_d(self):
		print("Метод из D")
obj = D()
obj.method_a()  # Наследуется через B или C
obj.method_b()  # Наследуется от B
obj.method_c()  # Наследуется от C
obj.method_d()  # Собственный метод класса D
Гибкость, но требует понимания механизма MRO (Method Resolution Order).
5. Иерархическое наследование
Описание: Один родительский класс имеет несколько дочерних классов.
Пример
class Animal:
	def make_sound(self):
		print("Животное издает звук")
class Dog(Animal):
	def bark(self):
		print("Собака лает: Гав-гав!")

class Cat(Animal):
	def meow(self):
		print("Кошка мяукает: Мяу-мяу!")
dog = Dog()
dog.make_sound()  # Унаследовано от Animal
dog.bark()        # Метод класса Dog
cat = Cat()
cat.make_sound()  # Унаследовано от Animal
cat.meow()        # Метод класса Cat
Позволяет разветвлять функциональность.
Как тебе урок?
Появился вопрос?
мы стараемся быть лучше :)