Атрибуты класса

Тренажер по Python для пользователей с начальным уровнем подготовки.

Тренажер по Python

В этом модуле мы погрузимся в тему Атрибуты класса в объектно-ориентированном программировании на Python. Вы узнаете, чем переменные, объявленные внутри класса, отличаются от переменных экземпляра (self).

Мы разберем:
1. Как создавать атрибуты, общие для всех объектов класса.
2. Как обращаться к ним через имя класса и через экземпляр.
3. Что такое "затенение" (shadowing) атрибутов класса атрибутами экземпляра.
4. Особенности работы с изменяемыми типами данных (списками) в качестве атрибутов класса.

Атрибуты класса — мощный инструмент для хранения глобальных настроек, констант или счетчиков, общих для всех созданных объектов. Будьте внимательны к синтаксису и логике работы памяти!

Список тем

1. Доступ к атрибуту класса

id: 40086_task_oop_attr_1

Посмотрите на код. Мы создали класс `SpaceShip` с атрибутом `fuel_type`. Что выведет функция `print`?

Выберите правильный вариант ответа
class SpaceShip:
    fuel_type = "Plasma"

print(SpaceShip.fuel_type)
Сообщения
Проверить
Показать подсказку

2. Объявление и использование константы класса

id: 40086_task_oop_attr_2

Допишите код так, чтобы класс `Circle` имел атрибут `PI`, равный 3.14, и метод для расчета площади, использующий этот атрибут класса.

Заполните пропуски
class Circle:
    input1S = 3.14  # Атрибут класса

    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return input2S * (self.radius ** 2)

c = Circle(10)
print(c.area())
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Где живут атрибуты?

id: 40086_task_oop_attr_3

Распределите строки кода по категориям: создают ли они атрибут класса или атрибут экземпляра.

Перетяните элементы в соответствующие блоки
Атрибуты класса
Атрибуты экземпляра
class Robot:
    kind = 'Droid'
    def __init__(self, name):
        self.name = name
        self.battery = 100
    version = 2.0
Сообщения
Проверить
Показать подсказку

4. Исправьте ошибку доступа

id: 40086_task_oop_attr_4

Программа должна подсчитывать количество созданных пользователей. Однако, при попытке увеличить счетчик возникает ошибка. Найдите и исправьте строку, где происходит неправильное обращение к атрибуту класса внутри метода.

Найдите ошибку и исправьте
class User:
    total_count = 0
 
    def __init__(self, name):
        self.name = name
        total_count += 1
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Общий счетчик

id: 40086_task_oop_attr_5

Проанализируйте код. Мы создаем три экземпляра класса, каждый раз увеличивая переменную класса `counter`. Чему будет равно значение `A.counter` в конце? Введите число.

Что должно получиться?
class A:
    counter = 0
    def __init__(self):
        A.counter += 1

x = A()
y = A()
z = A()
print(A.counter)
Сообщения
Проверить
Показать подсказку

6. Затенение атрибутов (Shadowing)

id: 40086_task_oop_attr_6

Это задание демонстрирует важную концепцию. У нас есть атрибут класса `color`. Сначала мы читаем его через экземпляр. Затем мы присваиваем значение `self.color`. Разберитесь, что будет выведено. Обратите внимание: присваивание `self.var = ...` создает новый атрибут у экземпляра, не меняя класс!

Нужно правильно расставить в пропуски предложенные варианты
class Car:
    color = 'White'

my_car = Car()
print(input1S) # Выведет 'White' (берет у класса)

my_car.color = 'Red' # Создаем атрибут экземпляра!

print(input2S) # Выведет 'White' (оригинал в классе не изменился)
print(input3S) # Выведет 'Red' (новый атрибут экземпляра)
my_car.color
Car.color
my_car.color
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Соберите класс с настройками

id: 40086_task_oop_attr_7

Соберите код, который определяет класс `Config` с атрибутом `admin_email`. Затем создайте функцию `send_alert`, которая использует этот email, если сообщение является критическим ('Critical').

Перетяните в правильном порядке строки из одного блока в другой
class Config:
    admin_email = 'admin@site.com'
def send_alert(msg, level):
    if level == 'Critical':
        print(f"Sending to {Config.admin_email}")
    else:
        print("Log only")
Config.admin_email = 'support@site.com'
print(self.admin_email)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Ловушка изменяемых типов

id: 40086_task_oop_attr_8

Внимание! Это классическая ошибка новичков. Мы используем список (изменяемый тип) как атрибут класса.
Что выведет код для `b2.items` после того, как мы добавили элемент в `b1`?

Выберите правильный вариант ответа
class Box:
    items = []  # Общий список для всех коробок!

b1 = Box()
b2 = Box()

b1.items.append('Apple')

print(b2.items)
Сообщения
Проверить
Показать подсказку

9. Влияние изменения атрибута класса

id: 40086_task_oop_attr_9

Восстановите хронологию выполнения кода. Мы меняем атрибут класса `rate` в середине программы. Посмотрите, как это влияет на результат вывода.

Расставьте строки в правильном порядке
print(obj.rate) # Выведет 1.5
obj.rate = 2.0
    rate = 1.0
print(obj.rate) # Выведет 1.0
class Bank:
Bank.rate = 1.5
obj = Bank()
Сообщения
Проверить
Показать подсказку

Python: запуск кода в браузере

id: 40086_compiler
🐍
Запустить тренажёр (Python)
НайтиКурс.Ру