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

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

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

🍀 Желаем приятного изучения!
Download Telegram
Конструктор класса 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
Сеттеры и геттеры

Контроль при установке значений:

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

@property
def balance(self):
return self.__balance

@balance.setter
def balance(self, value):
if value >= 0:
self.__balance = value
else:
print("Баланс не может быть отрицательным!")

account = BankAccount(1000)
account.balance = 1500 # Работает
account.balance = -500 # "Баланс не может быть отрицательным!"
👍3🔥1👏1👌1
Базовое наследование классов

Простыми словами:
Создание нового класса на основе существующего. Новый класс получает все свойства и методы родителя.

Пример из жизни:
· Родитель: Животное (есть, спать)
· Ребенок: Собака (все то же + лаять)
· Ребенок: Кошка (все то же + мяукать)

class Animal:  # Родительский класс
def __init__(self, name):
self.name = name

def eat(self):
return f"{self.name} ест"

def sleep(self):
return f"{self.name} спит"

class Dog(Animal): # Дочерний класс
def bark(self):
return f"{self.name} гавкает"

class Cat(Animal): # Дочерний класс
def meow(self):
return f"{self.name} мяукает"

# Использование
dog = Dog("Бобик")
print(dog.eat()) # Унаследовано от Animal
print(dog.bark()) # Собственный метод

cat = Cat("Мурка")
print(cat.sleep()) # Унаследовано от Animal
print(cat.meow()) # Собственный метод
👍4🔥1😎1
Переопределение методов

Изменение поведения унаследованного метода:
class Animal:
def __init__(self, name):
self.name = name

def make_sound(self):
return "Какое-то животное издает звук"

class Dog(Animal):
def make_sound(self): # Переопределяем метод
return "Гав!"

class Cat(Animal):
def make_sound(self): # Переопределяем метод
return "Мяу!"

animals = [Dog("Собака"), Cat("Кошка")]
for animal in animals:
print(animal.make_sound())
# Вывод:
# Гав!
# Мяу!
🔥3👍1🤩1👌1
Ключевое слово super()

Обращение к родительскому классу:

class Animal:
def __init__(self, name, age):
self.name = name
self.age = age

class Dog(Animal):
def __init__(self, name, age, breed):
super().__init__(name, age) # Вызов конструктора родителя
self.breed = breed # Добавляем новое свойство

dog = Dog("Бобик", 3, "Такса")
print(dog.name) # Бобик (от Animal)
print(dog.age) # 3 (от Animal)
print(dog.breed) # Такса (от Dog)
👍3🔥1👏1😁1
Множественное наследование

Наследование от нескольких классов:
class Flyable:
def fly(self):
return "Лечу!"

class Swimmable:
def swim(self):
return "Плыву!"

class Duck(Flyable, Swimmable): # Наследуем от двух классов
def quack(self):
return "Кря-кря!"

duck = Duck()
print(duck.fly()) # От Flyable
print(duck.swim()) # От Swimmable
print(duck.quack()) # Собственный метод
👍3👏2🔥1😁1
Порядок разрешения методов (MRO)

Python ищет методы в определенном порядке:
class A:
def method(self):
return "Метод из A"

class B(A):
def method(self):
return "Метод из B"

class C(A):
def method(self):
return "Метод из C"

class D(B, C):
pass

print(D.__mro__) # Показывает порядок поиска методов
# (<class '__main__.D'>, <class '__main__.B'>,
# <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

obj = D()
print(obj.method()) # "Метод из B" (ищет в порядке MRO)
👏3👍1🔥1🤩1