Магия Python: @classmethod, @staticmethod и @property на практике

Магия Python: @classmethod, @staticmethod и @property на практике

Декораторы классов — мощный инструмент для создания элегантного ООП-кода в Python. Но чтобы использовать их эффективно, нужно понимать разницу между @classmethod, @staticmethod и @property. Разберём каждый на реалистичных примерах с сравнением подходов.

@property: Контролируемый доступ к атрибутам

Проблема без декоратора:
Без @property для валидации данных приходится использовать методы-сеттеры, что ломает естественность работы с атрибутами.

class UserWithoutProperty:
    def __init__(self, name):
        self.name = name
        self._age = 0

    def get_age(self):
        return self._age

    def set_age(self, value):
        if not (0 < value < 120):
            raise ValueError("Invalid age")
        self._age = value

# Неудобное использование:
user = UserWithoutProperty("Alice")
user.set_age(25)  # Вызов метода вместо присваивания
print(user.get_age())  # Не как обычное свойство

Решение с @property:
Декоратор превращает методы в атрибуты с логикой:

class User:
    def __init__(self, name):
        self.name = name
        self._age = 0

    @property
    def age(self):
        return f"Возраст: {self._age} лет"

    @age.setter
    def age(self, value):
        if not (0 < value < 120):
            raise ValueError("Недопустимый возраст")
        self._age = value

# Естественное использование:
user = User("Bob")
user.age = 30  # Вызывает сеттер с валидацией
print(user.age)  # Возраст: 30 лет (геттер форматирует данные)

Плюсы:
Инкапсуляция внутреннего состояния
Валидация при установке значений
Ленивые вычисления (например, загрузка данных по требованию)
Совместимость с обычным доступом к атрибутам

Минусы:
Избыточность для простых атрибутов без логики
Неочевидность побочных эффектов при чтении

ЧИТАТЬ ДАЛЕЕ …

Проверка переменной на None в Python

Проверка переменной на None в Python

Одной из общих задач при написании кода на Python является проверка того, является ли значение переменной None или нет. В Python есть несколько способов сделать это, но некоторые из них являются более предпочтительными по сравнению с другими.

Рассмотрим три самых распространенных способа проверки значения на None:

Представьте, что у вас есть коробка, и вы хотите проверить, пуста ли она или нет.

Вариант 1: if val != None:

Аналогия: Вы открываете коробку и смотрите, пуста ли она. Если внутри что-то есть, вы говорите: "Коробка не пустая".

val = None
if val != None:
    print("Коробка не пустая")
else:
    print("Коробка пустая")

Объяснение: Здесь вы просто проверяете, не равно ли содержимое коробки (переменная val) значению None.

ЧИТАТЬ ДАЛЕЕ …

Модуль 2. Домашняя работа по уроку "Цикл for. Элементы списка. Полезные функции в цикле"

Модуль 2. Домашняя работа по уроку «Цикл for. Элементы списка. Полезные функции в цикле»

Цель: закрепить навык решения задач при помощи цикла for, применив знания об основных типах данных.

Задача "Всё не так уж просто":
Дан список чисел numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
Используя этот список составьте второй список primes содержащий только простые числа.
А так же третий список not_primes, содержащий все не простые числа.
Выведите списки primes и not_primes на экран(в консоль).

Пункты задачи:

  • Создайте пустые списки primes и not_primes.
  • При помощи цикла for переберите список numbers.
  • Напишите ещё один цикл for (вложенный), где будут подбираться делители для числа из 1ого цикла.
  • Отметить простоту числа можно переменной is_prime, записав в неё занчение True перед проверкой.
  • В процессе проверки на простоту записывайте числа из списка numbers в списки primes и not_primes в зависимости от значения переменной is_prime после проверки (True — в prime, False — в not_prime).
  • Выведите списки primes и not_primes на экран(в консоль).

ЧИТАТЬ ДАЛЕЕ …

Модуль 2. Домашняя работа по уроку "Стиль кода часть II. Цикл While"

Модуль 2. Домашняя работа по уроку «Стиль кода часть II. Цикл While»

Цель: применить навыки создания цикла while, а так же применения операторов break и continue.

Задача "Нули ничто, отрицание недопустимо!":
Дан список чисел [42, 69, 322, 13, 0, 99, -5, 9, 8, 7, -6, 5]
Нужно выписывать из этого списка только положительные числа до тех пор, пока не встретите отрицательное или не закончится список (выход за границу).

Пункты задачи:

  • Запишите исходный список в переменную my_list.
  • Напишите цикл while с соответствующими задаче условиями.
  • Используйте операторы прерывания/продолжения цикла в соответствии с условиями задачи.

ЧИТАТЬ ДАЛЕЕ …

Модуль 2. Домашняя работа по уроку "Условная конструкция. Операторы if, elif, else"

Модуль 2. Домашняя работа по уроку «Условная конструкция. Операторы if, elif, else»

Цель: Применить навыки создания условных конструкций и знания операторов if, else, elif / and, or, not.

Задача "Все ли равны?":
На вход программе подаются 3 целых числа и записываются в переменные first, second и third соответственно.
Ваша задача написать условную конструкцию (из ifelifelse), которая выводит кол-во одинаковых чисел среди 3-х введённых.

Пункты задачи:

  1. Если все числа равны между собой, то вывести 3
  2. Если хотя бы 2 из 3 введённых чисел равны между собой, то вывести 2
  3. Если равных чисел среди 3-х вообще нет, то вывести 0

ЧИТАТЬ ДАЛЕЕ …

Модуль 2. Самостоятельная работа по уроку "Цели и задачи. Поток выполнения программы"

Модуль 2. Самостоятельная работа по уроку «Цели и задачи. Поток выполнения программы»

Самостоятельная работа по уроку "Цели и задачи. Поток выполнения программы. Как интерпретатор показывает переменные."

  1. Создайте новый проект
  2. В файл main.py добавьте следующий код
    print('Hi, PyCharm')
    x = 43
    y = 32
    print(x * y)
    print("End line")

    ЧИТАТЬ ДАЛЕЕ …

Модуль 1. Дополнительное практическое задание по модулю

Модуль 1. Дополнительное практическое задание по модулю

Цель: Применить знания полученные в модуле, решив задачу повышенного уровня сложности

Предисловие:

Сложность подобных задач заключается в:

  1. Отсутствии чёткого алгоритма решения. Его вы должны придумать сами на основе полученных ранее знаний (синтаксиса и инструментов).
  2. Объединении большинства тем изученного модуля.
  3. Предполагаемом большом объёме решения.

Задание "Средний балл":

Вам необходимо решить задачу из реальной жизни: "школьные учителя устали подсчитывать вручную средний балл каждого ученика, поэтому вам предстоит автоматизировать этот процесс":

На вход даны следующие данные:

  1. Список: grades = [[5, 3, 3, 5, 4], [2, 2, 2, 3], [4, 5, 5, 2], [4, 4, 3], [5, 5, 5, 4, 5]]

  2. Множество: students = {‘Johnny’, ‘Bilbo’, ‘Steve’, ‘Khendrik’, ‘Aaron’}

  3. Список grades содержит списки оценок для каждого ученика в алфавитном порядке.
    Например: ‘Aaron’ — [5, 3, 3, 5, 4]

  4. Множество students содержит неупорядоченную последовательность имён всех учеников в классе.

Напишите программу, которая составляет словарь, используя grades и students, где ключом будет имя ученика, а значением — его средний балл.

Вывод в консоль:

{'Aaron': 4.0, 'Bilbo': 2.25, 'Johhny': 4.0, 'Khendrik': 3.6666666666666665, 'Steve': 4.8}

ЧИТАТЬ ДАЛЕЕ …

Модуль 1. Практическое задание по теме "Словари и множества"

Модуль 1. Практическое задание по теме «Словари и множества»

Цель: Написать программу на языке Python, используя Pycharm, для работы со словарями и множествами.

  1. В проекте, где вы решаете домашние задания, создайте модуль ‘module_1_6.py‘ и напишите весь код в нём.
  2. Работа со словарями:
      — Создайте переменную my_dict и присвойте ей словарь из нескольких пар ключ-значение.
    Например: Имя (str) — Год рождения (int).
      — Выведите на экран словарь my_dict.
      — Выведите на экран одно значение по существующему ключу, одно по отсутствующему из словаря my_dict без ошибки.
      — Добавьте ещё две произвольные пары того же формата в словарь my_dict.
     — Удалите одну из пар в словаре по существующему ключу из словаря my_dict и выведите значение из этой пары на экран.
      — Выведите на экран словарь my_dict.

ЧИТАТЬ ДАЛЕЕ …

Модуль 1. Практическое задание по теме: "Неизменяемые и изменяемые объекты. Кортежи и списки"

Модуль 1. Практическое задание по теме: «Неизменяемые и изменяемые объекты. Кортежи и списки»

Цель: Написать программу на языке Python, используя Pycharm, для работы с неизменяемыми и изменяемыми объектами.

  1. В проекте, где вы решаете домашние задания, создайте модуль ‘module_1_5.py‘ и напишите весь код в нём.
  2. Задайте переменные разных типов данных:
      — Создайте переменную immutable_var и присвойте ей кортеж из нескольких элементов разных типов данных.
      — Выполните операции вывода кортежа immutable_var на экран.
  3. Изменение значений переменных:
      — Попытайтесь изменить элементы кортежа immutable_var. Объясните, почему нельзя изменить значения элементов кортежа.
  4. Создание изменяемых структур данных:
      — Создайте переменную mutable_list и присвойте ей список из нескольких элементов.
      — Измените элементы списка mutable_list.
      — Выведите на экран измененный список mutable_list.

ЧИТАТЬ ДАЛЕЕ …

Модуль 1. Практическая работа по уроку "Организация программ и методы строк"

Модуль 1. Практическая работа по уроку «Организация программ и методы строк»

Цель: Написать программу на языке Python с использованием Pycharm для работы с методами строк и организации программ.

  1. В проекте, где вы решаете домашние задания, создайте модуль ‘module_1_4.py‘ и напишите весь код в нём.
  2. Организуйте программу:
    1. Создайте переменную my_string и присвойте ей значение строки с произвольным текстом (функция input()).
    2. Вывести количество символов введённого текста
  3. Работа с методами строк:
    Используя методы строк, выполните следующие действия:

    1. Выведите строку my_string в верхнем регистре.
    2. Выведите строку my_string в нижнем регистре.
    3. Измените строку my_string, удалив все пробелы.
    4. Выведите первый символ строки my_string.
    5. Выведите последний символ строки my_string.

ЧИТАТЬ ДАЛЕЕ …

Модуль 1. Практическое задание по уроку "Строки и индексация строк"

Модуль 1. Практическое задание по уроку «Строки и индексация строк»

Цель: Научиться работать со строками и индексацией строк в Python.

Задача:

  1. В переменную example запишите любую строку.
  2. Выведите на экран(в консоль) первый символ этой строки.
  3. Выведите на экран(в консоль) последний символ этой строки (используя отрицательный индекс).
  4. Выведите на экран(в консоль) вторую половину этой строки (С нечётным количеством символов: ‘Urban’ -> ‘ban’).
  5. Выведите на экран(в консоль) это слово наоборот.
  6. Выведите на экран(в консоль) каждый второй символ этой строки. (Пример: ‘Топинамбур’->’оиабр’)
  7. Вводные данные:
    example = ‘Топинамбур’
    Вывод на экран(в консоль):

    Т
    р
    амбур
    рубманипоТ
    оиабр

ЧИТАТЬ ДАЛЕЕ …

Модуль 1. Практическая работа по уроку "Динамическая типизация"

Модуль 1. Практическая работа по уроку «Динамическая типизация»

Цель: Написать программу на языке Python, используя Pycharm, для демонстрации динамической типизации.

  1. В проекте, где вы решаете домашние задания, создайте модуль ‘module_1_3.py’ и напишите весь код в нём.
  2. Создайте переменные разных типов данных:
    • Создайте переменную name и присвойте ей значение вашего имени (строка).
    • Выведите значение переменной name на экран.
    • Создайте переменную age и присвойте ей значение вашего возраста (целое число).
    • Выведите значение переменной age на экран.
    • Перезапишите в age текущее значение переменной age + новое.

Как неверно (просто перезапись на новое число):
a = 15
a = 17

  • Выведите измененное значение переменной age на экран.
  • Создайте переменную is_student и присвойте ей значение True (логическое значение).
  • Выведите значение переменной is_student на экран.

Примечания:

  • Для вывода значений на экран используйте функцию print().
  • Обратите внимание на использование разных типов данных и возможности их изменения.

Пример результата выполнения программы:
Name: John
Age: 25
New Age: 26
Is Student: True

Успехов!

Решение:

Решение можно скачать с Boosty.to


Как можно отблагодарить:

  • Оформить удобную для вас подписку на Boosty.to
  • Разово поддержать через DonationAlerts

Модуль 0. Практическое задание по уроку «Базовые структуры данных»

Цель: применить и закрепить базовые знания о структурах данных, решив набор задач.

Формат решения:
Можете написать код всех задач в одном файле main.py.
Можете написать код в разных файлах к каждой задаче: task1.py, task2.py и т.д.

Задачи.

Предисловие:

Если в задаче говориться о том, что нужно вывести результат арифметических действий, сравнения и других операций, то вам нужно сначала составить выражение с исходными данными, а не вывести результат этого выражения сразу.

Пример: сложите числа 12 и 89, вычтите число1 и выведите результат на экран,
Верно: print(12 + 89 — 1)
Не верно: print(100)

ЧИТАТЬ ДАЛЕЕ …

Модуль 0. Практическое задание по вводному уроку

Модуль 0. Практическое задание по вводному уроку

Вам необходимо установить PythonPycharm из вводного урока №2
А также собрать и скомпилировать ваш первый проект "Hello world".

  1. Установите Python и Pycharm из урока "Установка среды разработки PyCharm и Python."
  2. Создайте новый проект в Pycharm. На главном экране нажмите New Project, а далее Create
  3. В файле main.py Напишите команду print("Hello world")
  4. Нажмите кнопку сборки проекта. В консоли вы увидите "Hello world" — это результат работы вашей программы, а значит у вас все получилось и все установлено корректно

ЧИТАТЬ ДАЛЕЕ …

Модуль 31. Задача 6. Web scraping

Модуль 31. Задача 6. Web scraping

Дан несложный пример HTML-страницы: Sample Web Page.

Изучите код этой страницы и реализуйте программу, которая получает список всех подзаголовков сайта (они заключены в теги h3).

Ожидаемый результат:

['CONTENTS', '1. Creating a Web Page', '2. HTML Syntax', '3. Special Characters', '4. Converting Plain Text to HTML', '5. Effects', '6. Lists', '7. Links', '8. Tables', '9. Viewing Your Web Page', '10. Installing Your Web Page on the Internet', '11. Where to go from here', '12. Postscript: Cell Phones']

Сделайте так, чтобы программа работала для любого сайта, где есть такие теги.

ЧИТАТЬ ДАЛЕЕ …